Junior
Hash cədvəli necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Hash cədvəli (hash table) — əlaqəli massiv tətbiq edən məlumat quruluşudur.
İş prinsipi:
- Hashing. Hər bir açar (key) üçün hash kodu (hash code) hash funksiyası (hash function) vasitəsilə hesablanır. Hash kodu tam ədəddir.
- İndeksləmə. Hash kodu, daxili strukturun (məsələn, hash cədvəlinin) massivində (və ya vektor) indeks (index) müəyyən etmək üçün istifadə olunur. Adətən, indeks
hash_code % array_sizekimi hesablanır, buradaarray_sizemassiv ölçüsüdür. - Yadda saxlanma. Tapılan indeksdə, açarla əlaqəli dəyər (value) saxlanılır.
Məsələlər və həll yolları:
- Çatışmalar. Müxtəlif açarlar eyni hash kodu verə bilər və nəticədə eyni indeksə malik ola bilər. Bu, çatışma adlanır.
- Çatışma həll üsulları:
- Zəncir üsulu (Separate Chaining): Hər massiv hüceyrəsində "açar-dəyər" cütlərinin siyahısı (siyahı, vektor və s.) saxlanılır. Çatışma baş verdikdə, yeni cüt bu siyahıya əlavə olunur. İndeksə görə axtarışda, müvafiq siyahı yoxlanılır və lazım olan açar tapılır.
- Açıq ünvanlama (Open Addressing): Çatışma baş verdikdə, müəyyən bir qayda (sınaq) ilə başqa boş hüceyrə axtarılır.
- Xətti sınaq (Linear Probing):
index + 1,index + 2, və s. hüceyrələr ardıcıl yoxlanılır, massiv ölçüsü ilə mod alınır. - Kvadrat sınaq (Quadratic Probing):
index + 1^2,index + 2^2, və s. hüceyrələr yoxlanılır, massiv ölçüsü ilə mod alınır. - İkiqat hash (Double Hashing): İkinci hash funksiyası istifadə edilərək, sınaq addımı müəyyən edilir.
- Xətti sınaq (Linear Probing):
- Çatışma həll üsulları:
Üstünlüklər:
- Orta hesabla, əlavə etmə, silmə və axtarış əməliyyatları O(1) mürəkkəbliklə həyata keçirilir.
Çatışmazlıqlar:
- Ən pis halda (məsələn, çox sayda çatışma və ya pis hash funksiyası ilə) əməliyyatların mürəkkəbliyi O(n) çatır, burada n elementlərin sayıdır.
- Əlavə yaddaş tələb edir (məsələn, zəncir üsulunda siyahılar və ya açıq ünvanlamada sınaq üçün).
C++-da istifadə nümunəsi (std::unordered_map):
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
// Hash cədvəli yaradılması (unordered_map)
std::unordered_map<std::string, int> yaş;
// Elementlərin əlavə olunması
yaş["Alice"] = 30;
yaş["Bob"] = 25;
yaş["Charlie"] = 35;
// Açar ilə dəyəri alma
std::cout << "Alice-in yaşı: " << yaş["Alice"] << std::endl;
// Elementin axtarışı
if (yaş.count("Bob")) {
std::cout << "Bob xəritədədir." << std::endl;
}
// Elementin silinməsi
yaş.erase("Charlie");
return 0;
}