Sobes.tech
Junior — Middle

Хеш таблицаларын колдонууда кагылышууларды азайтуу үчүн кайсы ыкмаларды колдонсо болот?

sobes.tech AI

AIден жооп

Hash stollarynda to'qnashuvlar (koliziyalar) ehtimolini kamaytirish uchun quyidagi usullar qo'llaniladi:

  1. Yaxshi hash funksiyasini tanlash — funksiya kalitlarni hash stoliga teng taqsimlamog'i va to'qnashuv ehtimolini minimallashtirmog'i kerak.

  2. Stolning o'lchamini oshirish — qanchalik katta bo'lsa, ikki kalitning bir xil joyga tushish ehtimoli shunchalik kam bo'ladi.

  3. To'qnashuvlarni hal qilish usullaridan foydalanish:

    • Ochiq manzil (xatbosh, kvadrat, ikki marta hash) — to'qnashuv yuzaga kelganda, keyingi bo'sh joy qidiriladi.
    • Zanjir (chaining) — har bir hujayrada, bir xil hash-ga ega bo'lgan barcha elementlarni saqlovchi bog'langan ro'yxat yoki boshqa konteyner joylashadi.
  4. Rehashing (o'lchamini oshirish) — jadval yuklash koeffitsienti ma'lum darajaga yetganda, o'lcham oshiriladi va elementlar qayta taqsimlanadi.

Kotlin misolida zanjir bilan:

class HashTable<K, V>(val size: Int) {
    private val buckets = Array<MutableList<Pair<K, V>>>(size) { mutableListOf() }

    private fun hash(key: K): Int = key.hashCode().absoluteValue % size

    fun put(key: K, value: V) {
        val index = hash(key)
        val bucket = buckets[index]
        val existing = bucket.indexOfFirst { it.first == key }
        if (existing >= 0) bucket[existing] = key to value
        else bucket.add(key to value)
    }

    fun get(key: K): V? {
        val index = hash(key)
        return buckets[index].firstOrNull { it.first == key }?.second
    }
}