Sobes.tech
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:

  1. 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.
  2. İ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_size yekun indeksi verir.
  3. Yadda saxlanması: Massivdə, hesablanmış indeksdə, (açar, dəyər) cütlüyü saxlanılır.
  4. 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.
  5. Ç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