Junior — Middle
Milliste meetoditega saab vähendada kokkupõrke tõenäosust kasutades hajutustabeleid?
sobes.tech AI
Vastus AI-lt
Selleks, et vähendada kokkupõrke (kollisioonide) tõenäosust hajutustabelites, kasutatakse järgmisi meetodeid:
-
Hea hajufunktsiooni valimine — funktsioon peaks ühtlaselt jaotama võtmed hajutustabelis, minimeerides kokkupõrke tõenäosust.
-
Tabeli suuruse suurendamine — mida suurem on massiiv, seda väiksem on tõenäosus, et kaks võtit satuvad samasse lahtrisse.
-
Kollisioonide lahendamise meetodite kasutamine:
- Ava aadressimine (jooneline otsing, kvadratiivne otsing, topelt hajutamine) — kollisiooni korral otsitakse järgmine vaba lahter.
- Kettimine (chaining) — igas lahtris hoitakse seotud nimekiri või muu konteiner kõigi samasse hash-i kuuluvate elementide jaoks.
-
Rehashing (suurendamine) — kui saavutatakse teatud laadimistegur, suurendatakse suurust ja elemente ümber jaotatakse.
Näide Kotlinis (kettimine):
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
}
}