Hash table nasıl çalışır? Çakışmalar (collision) nasıl çözülür?

Cevap

Hash table, anahtarı bir hash fonksiyonu ile sayıya çevirip dizide bir indekse (hash(key) % kapasite) eşler. Bu sayede ortalama O(1) ekleme, arama ve silme sağlar.

Çakışma, iki farklı anahtarın aynı indekse düşmesidir. Kapasite sınırlı olduğu için kaçınılmazdır.

1. Separate chaining (zincirleme)

Her kova (bucket) bir liste tutar; aynı indekse düşenler listeye eklenir.

class HashMap:
    def __init__(self, cap=8):
        self.buckets = [[] for _ in range(cap)]

    def put(self, key, val):
        b = self.buckets[hash(key) % len(self.buckets)]
        for i, (k, _) in enumerate(b):
            if k == key:
                b[i] = (key, val); return
        b.append((key, val))

    def get(self, key):
        b = self.buckets[hash(key) % len(self.buckets)]
        for k, v in b:
            if k == key: return v
        raise KeyError(key)

Java'nın HashMap'i bir kovada eleman sayısı çok artınca listeyi dengeli ağaca çevirir.

2. Open addressing (açık adresleme)

Tüm elemanlar dizide durur; dolu indekse denk gelinirse başka bir boş yer aranır:

  • Linear probing: i+1, i+2, ... (önbellek dostu ama kümelenme olur)
  • Quadratic probing, double hashing

Silmede "tombstone" işareti gerekir, yoksa arama zinciri kopar. Python dict açık adresleme kullanır.

Load factor ve yeniden boyutlandırma

load factor = eleman sayısı / kapasite. Eşik aşılınca (ör. 0.75) kapasite genelde iki katına çıkarılır ve tüm elemanlar yeniden hash'lenir: tek seferde O(n), ama amortize O(1).

En kötü durumda (her şey aynı kovaya düşerse) işlemler O(n) olur; iyi hash fonksiyonu anahtarları düzgün dağıtmalıdır.

  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle