Junior — Middle
Хеш таблицаларын колдонууда кагылышууларды азайтуу үчүн кайсы ыкмаларды колдонсо болот?
sobes.tech AI
AIден жооп
Hash stollarynda to'qnashuvlar (koliziyalar) ehtimolini kamaytirish uchun quyidagi usullar qo'llaniladi:
-
Yaxshi hash funksiyasini tanlash — funksiya kalitlarni hash stoliga teng taqsimlamog'i va to'qnashuv ehtimolini minimallashtirmog'i kerak.
-
Stolning o'lchamini oshirish — qanchalik katta bo'lsa, ikki kalitning bir xil joyga tushish ehtimoli shunchalik kam bo'ladi.
-
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.
-
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
}
}