Sobes.tech
Junior

Hash tabloları ve temel çalışma prensipleri hakkında bilgi verin.

sobes.tech yapay zeka

AI'dan gelen yanıt

Hash tablosu (hash haritası), anahtarları değerlere eşleyen bir veri yapısıdır.

Çalışma prensibi:

  1. Hashleme: Her anahtar için, bir hash kodu hesaplanır — sabit boyutlu sayısal bir değer, bir hash fonksiyonu kullanılarak. İyi bir hash fonksiyonu, hash kodlarını çıktı aralığı boyunca eşit şekilde dağıtır.
  2. İndeksleme: Hesaplanan hash kodu, karşılık gelen değerin saklanacağı dizideki indeksi (pozisyonu) belirlemek için kullanılır. Sıkça, hash(key) % array_size ifadesi, nihai indeksi verir.
  3. Depolama: Dizide, hesaplanan indekste, bir (anahtar, değer) çifti saklanır.
  4. Arama: Bir anahtarla değeri bulmak için, anahtarın hash kodu tekrar hesaplanır, indeks belirlenir ve bu indeksten değer alınır.
  5. Çakışmalar: Farklı anahtarların aynı hash koduna sahip olması durumudur. Çakışmaları çözmek için çeşitli yöntemler vardır:
    • Kuyruk yöntemi (Separate Chaining): Her dizininde, o indekse gelen tüm (anahtar, değer) çiftlerini içeren bir liste (veya başka bir veri yapısı) tutulur.
    • Açık adresleme (Open Addressing): Çakışma durumunda, belirli bir kurala göre dizide başka bir boş yer aranır (doğrusal sondalama, kare sondalama, çift hashleme).

Avantajlar:

  • Ortalama olarak, ekleme, silme ve arama işlemleri O(1) karmaşıklığındadır, eğer hash fonksiyonu iyiyse ve çakışmalar nadirdir.

Dezavantajlar:

  • En kötü durumda performans O(n) olabilir, eğer tüm anahtarlar aynı indekse hashlenmişse (örneğin, kötü bir hash fonksiyonu veya çok sayıda çakışma durumunda).
  • Ekstra bellek gerektirir, diziyi ve muhtemelen çakışma çözümünü içerecek şekilde.

Swift'te, hash tabloları Dictionary tipiyle uygulanır.

// Swift'te Dictionary kullanım örneği
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]

// Anahtar ile erişim
let value = myDictionary["banana"] // Optional(2) alır

// Ekleme/güncelleme
myDictionary["grape"] = 4 // Yeni bir çift ekler
myDictionary["apple"] = 10 // "apple" anahtarının değerini günceller

// Silme
myDictionary["orange"] = nil // "orange" anahtarına sahip çifti siler