Junior — Middle
Ce metode pot fi utilizate pentru a reduce probabilitatea coliziunilor la utilizarea tabelelor de hash?
sobes.tech AI
Răspuns de la AI
Pentru a reduce probabilitatea de coliziuni în tabelele hash, se aplică următoarele metode:
-
Alegerea unei funcții hash bune — funcția trebuie să distribuie uniform cheile în tabelul hash, minimizând probabilitatea de coliziuni.
-
Creșterea dimensiunii tabelului — cu cât dimensiunea array-ului este mai mare, cu atât mai mică este probabilitatea ca două chei să cadă în aceeași celulă.
-
Utilizarea metodelor de rezolvare a coliziunilor:
- Adresare deschisă (sondare liniară, sondare pătratică, hashing dublu) — în cazul unei coliziuni, se caută următoarea celulă liberă.
- Împletire (chaining) — în fiecare celulă se păstrează o listă legată sau alt container pentru toate elementele cu același hash.
-
Rehashing (redimensionare) — când se atinge un anumit factor de încărcare, dimensiunea este mărită și elementele sunt redistribuite.
Exemplu în Kotlin (împletire):
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
}
}