Junior — Middle
Ինչ մեթոդներ կարելի է օգտագործել հեշ-թերթերի օգտագործման ժամանակ բախումների հավանականությունը նվազեցնելու համար։
sobes.tech AI
Պատասխան AI-ից
Հաշվարկային աղյուսակներում բախումների (կոլիզիաների) հավանականությունը նվազեցնելու համար կիրառվում են հետևյալ մեթոդները:
-
Լավ հեշ-ֆունկցիա ընտրել — ֆունկցիան պետք է հավասարապես տարածի բանալիները հեշ-տախտակի վրա, նվազեցնելով բախումների հավանականությունը:
-
Տախտակի չափը մեծացնել — որքան մեծ է զանգվածը, այնքան քիչ է հավանականությունը, որ երկու բանալիներ ընկնեն նույն բջիջում:
-
Բախումները լուծելու մեթոդներ կիրառել:
- Բաց հասցեագրման մեթոդ (գծային որոնում, քառակուսային որոնում, երկակի հեշավորում) — բախում առաջանալիս, որոնվում է հաջորդ ազատ բջիջը:
- Շղթա (chaining) — յուրաքանչյուր բջիջում պահվում է կապված ցանկ կամ այլ կոնտեյներ, որը պահում է նույն հեշով բոլոր տարրերը:
-
Rehashing (վերամշակում) — երբ հասնում է որոշակի բեռնման գործակից, չափը մեծացվում է և տարրերը նորից բաշխվում:
Օրինակ Kotlin-ում (շղթա):
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
}
}