Sobes.tech
Junior — Middle

Ինչ մեթոդներ կարելի է օգտագործել հեշ-թերթերի օգտագործման ժամանակ բախումների հավանականությունը նվազեցնելու համար։

sobes.tech AI

Պատասխան AI-ից

Հաշվարկային աղյուսակներում բախումների (կոլիզիաների) հավանականությունը նվազեցնելու համար կիրառվում են հետևյալ մեթոդները:

  1. Լավ հեշ-ֆունկցիա ընտրել — ֆունկցիան պետք է հավասարապես տարածի բանալիները հեշ-տախտակի վրա, նվազեցնելով բախումների հավանականությունը:

  2. Տախտակի չափը մեծացնել — որքան մեծ է զանգվածը, այնքան քիչ է հավանականությունը, որ երկու բանալիներ ընկնեն նույն բջիջում:

  3. Բախումները լուծելու մեթոդներ կիրառել:

    • Բաց հասցեագրման մեթոդ (գծային որոնում, քառակուսային որոնում, երկակի հեշավորում) — բախում առաջանալիս, որոնվում է հաջորդ ազատ բջիջը:
    • Շղթա (chaining) — յուրաքանչյուր բջիջում պահվում է կապված ցանկ կամ այլ կոնտեյներ, որը պահում է նույն հեշով բոլոր տարրերը:
  4. 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
    }
}