Hash kolliziiyalarını həll etmək üçün hansı üsullar mövcuddur?
sobes.tech Süni İntellekt
AI-dan cavab
-
Zəncir metodları (Separate Chaining):
- Hesh cədvəlindəki hər bir element (baket) əlaqəli siyahıya (və ya digər məlumat strukturu, məsələn, ağac) göstəricidir.
- Eyni baketə hash olunan bütün elementlər bu siyahıya əlavə olunur.
// Nümunə: zəncir üçün əlaqəli siyahı düyünü struct Node { int key; int value; Node* next; }; // Baketdə siyahının başına göstərici saxlanılır Node* buckets[TABLE_SIZE]; -
Açıq ünvanlama metodları (Open Addressing):
- Bütün elementlər birbaşa hash cədvəlinin massivində saxlanılır.
- Çatışma zamanı növbəti boş yer axtarılır.
- Növbəti yerin müəyyənləşdirilməsi üsuluna görə fərqlənir:
-
Xətti sınaq (Linear Probing): Hüceyrələr ardıcıllıqla yoxlanır, sabit addımla
i, i+1, i+2, ... mod TABLE_SIZE.// Xətti sınaq nümunəsi int hash(int key) { return key % TABLE_SIZE; } int i = hash(key); while (table[i] != EMPTY && table[i].key != key) { i = (i + 1) % TABLE_SIZE; } // İndi table[i] ya boşdur, ya da axtarılan elementdir -
Kvadrat sınaq (Quadratic Probing): Hüceyrələr sınaq kvadratına görə yoxlanır
i, i+1², i+2², ... mod TABLE_SIZE.// Kvadrat sınaq nümunəsi int hash(int key) { return key % TABLE_SIZE; } int i = hash(key); int attempt = 0; while (table[i] != EMPTY && table[i].key != key && attempt < TABLE_SIZE) { attempt++; i = (hash(key) + attempt * attempt) % TABLE_SIZE; } // İndi table[i] ya boşdur, ya da axtarılan elementdir (və ya cədvəl yüklənmişdir) -
İkiqat hash (Double Hashing): İkinci hash funksiyası sınaq addımını müəyyən edir
i, i + step, i + 2*step, ... mod TABLE_SIZE, buradastepikinci hash funksiyası ilə hesablanır.// İkiqat hash nümunəsi int hash1(int key) { return key % TABLE_SIZE; } int hash2(int key) { return 1 + (key % (TABLE_SIZE - 1)); } int i = hash1(key); int step = hash2(key); while (table[i] != EMPTY && table[i].key != key) { i = (i + step) % TABLE_SIZE; } // İndi table[i] ya boşdur, ya da axtarılan elementdir
-
-
Dinamik ölçünün dəyişdirilməsi (Resizing):
- Müəyyən yüklənmə faktoru (load factor) çatdıqda, daha böyük yeni hash cədvəli yaradılır.
- Köhnə cədvəldəki bütün elementlər yenidən hash edilir və yeni cədvələ yerləşdirilir.
// Resayz üçün nümunə loji if (current_size / (double)table_size > max_load_factor) { // Yeni ikiqat ölçülü cədvəl yaradılır // Bütün elementlər yenidən hash edilir və yerləşdirilir // Köhnə cədvəl silinir }
Seçim metodu performans, yaddaş, tətbiq asanlığı və gözlənilən yüklənmə faktoru tələblərinə görə dəyişir. Zəncir metodları adətən daha sadədir və yüksək yüklənmə faktoru ilə yaxşı işləyir, lakin əlavə göstərici yaddaşı tələb edir. Açıq ünvanlama metodları yaddaşı daha səmərəli istifadə edə bilər, lakin hash funksiyasına və "yığım" probleminə daha həssasdır. Resayz isə element sayının artması ilə effektivliyi qorumaq üçün vacibdir.