Junior
Hash cədvəlləri və onların əsas işləmə prinsipi haqqında danış.
sobes.tech Süni İntellekt
AI-dan cavab
Hash cədvəli (hash xəritəsi) — açarları dəyərlərə xəritələyən məlumat quruluşudur və assosiativ massiv kimi həyata keçirilir.
İş prinsipi:
- Hashing: Hər bir açar üçün, hash kodu hesablanır — hash funksiyası vasitəsilə sabit ölçülü ədədi dəyər. Yaxşı hash funksiyası hash kodlarını çıxış diapazonu boyunca bərabər paylayır.
- İndeksləmə: Hesablanmış hash kodu, uyğun dəyərin saxlanacağı massivdəki indeks (mövqe) müəyyən etmək üçün istifadə olunur. Tez-tez,
hash(key) % array_sizeyekun indeksi verir. - Yadda saxlanması: Massivdə, hesablanmış indeksdə, (açar, dəyər) cütlüyü saxlanılır.
- Axtarış: Açar əsasında dəyəri tapmaq üçün, açarın hash kodu yenidən hesablanır, indeks müəyyən edilir və həmin indeksdən dəyər çıxarılır.
- Çakışmalar: Müxtəlif açarların eyni hash koduna malik olması halıdır. Çakışmaları həll etmək üçün müxtəlif metodlar mövcuddur:
- Separate Chaining: Hər massiv indeksində, həmin indekse gələn bütün (açar, dəyər) cütlüklərini ehtiva edən siyahı (və ya başqa məlumat quruluşu) saxlanılır.
- Open Addressing: Çakışma baş verdikdə, müəyyən bir qaydaya əsasən, massivdə başqa boş yer axtarılır (xətti sondalama, kvadrat sondalama, ikili hash).
Üstünlüklər:
- Orta hesabla, əlavə etmə, silmə və axtarış əməliyyatlarının mürəkkəbliyi O(1)-dir, əgər hash funksiyası yaxşıdır və çakışmalar azdır.
Çatışmazlıqlar:
- Ən pis halda, performans O(n) ola bilər, əgər bütün açarlar eyni indekse hash olunubsa (məsələn, pis hash funksiyası və ya çox sayda çakışma ilə).
- Əlavə yaddaş tələb olunur, massiv və ehtimal ki, çakışmaların həlli üçün.
Swift-də, hash cədvəlləri Dictionary tipi ilə həyata keçirilir.
// Swift-də Dictionary nümunəsi
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Açar ilə giriş
let value = myDictionary["banana"] // Optional(2) alır
// Əlavə/yeniləmə
myDictionary["grape"] = 4 // Yeni cütlük əlavə edir
myDictionary["apple"] = 10 // "apple" açarı üçün dəyəri yeniləyir
// Silmə
myDictionary["orange"] = nil // "orange" açarına malik cütlüyü silir