Junior — Middle
Koje metode možete koristiti da smanjite verovatnoću sudara pri korišćenju hash tabela?
sobes.tech АИ
Одговор од АИ
Za smanjenje verovatnoće sudara (kolizija) u hash tabelama koriste se sledeće metode:
-
Izbor dobre hash funkcije — funkcija treba ravnomerno da raspoređuje ključeve po hash tabeli, minimizirajući verovatnoću kolizija.
-
Povećanje veličine tabele — što je veći niz, to je manja verovatnoća da će dva ključa pasti u istu ćeliju.
-
Korišćenje metoda za rešavanje kolizija:
- Otvorena adresacija (linearno sondiranje, kvadratno sondiranje, dvostruko hashiranje) — pri koliziji traži se sledeća slobodna ćelija.
- Lančano povezivanje (chaining) — u svakoj ćeliji se čuva povezani spisak ili drugi kontejner za sve elemente sa istim hash-om.
-
Rehashing (povećanje veličine) — kada se dostigne određeni faktor opterećenja, veličina se povećava i elementi se redistribuiraju.
Primer u Kotlinu (lančano povezivanje):
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
}
}