Menu
Coddy logo textTech

Hash Tablosu

Son güncelleme

Bir hash tablosu, öğeleri bir kova dizisinde saklar. Bir anahtarı yerleştirmek veya bulmak için, anahtarı bir hash fonksiyonundan geçirir ve sonucun kova sayısına göre modunu alır - bu, kova indeksini O(1) içinde verir. Her anahtarın bir kovaya hash'lenip saklanmasını ve ardından bir aramanın doğrudan doğru kovaya atlamasını izlemek için yukarıdaki oynat düğmesine basın.

İki anahtar aynı kovaya düştüğünde - bir çakışma - bu görselleştirme ayrı zincirleme kullanır: her kova küçük bir liste tutar ve çakışan anahtarlar buna eklenir. Tablo çok dolu olmadığı sürece (düşük bir yük faktörü) ve hash anahtarları iyi dağıttığı sürece, zincirler kısa kalır ve ekleme, arama ve silme ortalama olarak O(1)'dir.

Zaman karmaşıklığı

İşlemOrtalamaEn kötü durum
EklemeO(1)O(n) (tüm anahtarlar çakışır)
AramaO(1)O(n)
SilmeO(1)O(n)
AlanO(n)O(n)

Temel kavramlar

TerimAnlam
Hash fonksiyonuBir anahtarı bir kova indeksine eşler
Çakışmaİki anahtar aynı kovaya düşer
Ayrı zincirlemeHer kova çakışan girdilerin bir listesini tutar
Açık adreslemeAlternatif: bir sonraki boş yuvayı yokla
Yük faktörügirdiler / kovalar - yeniden boyutlandırmayı belirler

Çözümlü örnek

hash(k) = k % 7 kullanarak 20, 34, 9, 13 anahtarlarını 7 kovalı bir tabloya ekleme:

AdımYapıEylem
20 eklekova 6: [20]20 % 7 = 6, kova 6 boş, 20 sakla
34 eklekova 6: [20, 34]34 % 7 = 6, 20 ile çakışma, 34'ü zincire ekle
9 eklekova 2: [9]9 % 7 = 2, kova 2 boş, 9 sakla
13 eklekova 6: [20, 34, 13]13 % 7 = 6, çakışma, 13'ü kova 6'nın zincirine ekle
34 arakova 6: [20, 34, 13]34 % 7 = 6, zinciri tara: 20 hayır, 34 eşleşti - bulundu

Hash tablosu ne zaman kullanılır

Şu durumda kullanŞu durumda kaçın
Anahtara göre ortalama O(1) ekleme, arama ve silmeye ihtiyacın varAnahtarları sıralı tutman gerek - dengeli bir BST kullan
Anahtarların yararlı bir sıralaması yok ve yalnızca tam eşleşme üyeliğini test ediyorsunAralık sorgularına veya en yakın anahtar aramalarına ihtiyacın var
Kovalar ve düşük yük faktörü için biraz ekstra bellek ayırabilirsinBellek son derece kısıtlı ve her bayt önemli
Anahtar türün için iyi bir hash fonksiyonu varEn kötü durum gecikmesi sınırlı olmalı - çakışmalar onu O(n) yapar

Hash Table kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Hash Table uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Hash Table kodu

Python
1class HashTable:2    def __init__(self, size=8):3        self.size = size4        self.buckets = [[] for _ in range(size)]5
6    def _index(self, key):7        # Hash the key to a bucket; different keys can collide8        return sum(ord(ch) for ch in key) % self.size9
10    def set(self, key, value):11        bucket = self.buckets[self._index(key)]12        for i, (k, _) in enumerate(bucket):13            if k == key:14                bucket[i] = (key, value)  # update existing key15                return16        bucket.append((key, value))  # chain on collision17
18    def get(self, key):19        for k, v in self.buckets[self._index(key)]:20            if k == key:21                return v22        raise KeyError(key)23
24    def delete(self, key):25        bucket = self.buckets[self._index(key)]26        for i, (k, _) in enumerate(bucket):27            if k == key:28                del bucket[i]29                return30        raise KeyError(key)31
32
33table = HashTable()34table.set("apple", 3)35table.set("banana", 7)36table.set("cherry", 5)37
38print("apple  ->", table.get("apple"))39print("banana ->", table.get("banana"))40table.set("apple", 10)41print("apple  ->", table.get("apple"))42table.delete("banana")43print("bucket sizes:", [len(b) for b in table.buckets])
Bu kodu Python Playground'da çalıştır

Hash Tablosu SSS

Hash çakışması nedir ve nasıl çözülür?
Çakışma, iki farklı anahtar aynı kovaya hash'lendiğinde olur. İki yaygın çözüm, ayrı zincirlemedir (her kova bir liste tutar ve çakışan anahtarlar eklenir - burada gösterilir) ve açık adreslemedir (dizide bir sonraki boş yuvayı yokla). Her ikisi de aramaları doğru tutar; bellek düzeni ve yüksek yük altındaki performansta farklılık gösterirler.
Bir hash tablosunun zaman karmaşıklığı nedir?
Hash fonksiyonu anahtarları eşit dağıttığında ve yük faktörü düşük tutulduğunda ekleme, arama ve silme ortalama olarak O(1)'dir. En kötü durumda - tüm anahtarlar tek bir kovaya çakışırken - bunlar O(n)'e bozulur; bu yüzden iyi bir hash fonksiyonu ve yeniden boyutlandırma önemlidir.
Yük faktörü nedir?
Yük faktörü, saklanan girdi sayısının kova sayısına bölümüdür. Büyüdükçe zincirler uzar ve işlemler yavaşlar, bu yüzden çoğu hash tablosu 0.75 gibi bir eşiği aştığında yeniden boyutlandırılır (daha büyük bir diziye yeniden hash'lenir).
İkili arama ağacı yerine ne zaman hash tablosu kullanmalıyım?
Yalnızca tam eşleşme aramalarına ihtiyacın olduğunda ve sıralama gereksinimi olmadan ortalama O(1) hız istediğinde bir hash tablosu kullan. Sıralı anahtarlara, aralık sorgularına veya öncül/ardıl aramalarına ihtiyacın olduğunda dengeli bir ikili arama ağacı kullan; bunları bir hash tablosu verimli yapamaz. Bir BST garantili O(log n) işlemler sunarken, bir hash tablosu bu garantiyi daha hızlı ortalama performans için takas eder.
Ayrı zincirleme ile açık adresleme arasındaki fark nedir?
Ayrı zincirleme, çakışan anahtarları kova başına bir listede saklar, böylece bir kova birçok girdi tutabilir ve tablo asla gerçekten dolmaz. Açık adresleme her şeyi dizinin kendisinde tutar ve bir çakışmada bir sonraki boş yuvayı yoklar; bu önbellek dostudur ama yük faktörü 1'e yaklaştıkça keskin biçimde bozulur ve dikkatli silme işlemi gerektirir. Zincirleme daha yüksek yük faktörlerini tolere eder; açık adresleme belleği daha kompakt kullanır.
Bir hash tablosunun anahtarlarımı ekleme veya sıralama düzeninde tutacağına neden güvenemem?
Bir hash fonksiyonu, kümelenmeyi önlemek için anahtarları kovalar arasında bilerek dağıtır, bu yüzden yineleme sırası ekleme veya sıralama düzenini değil, kova düzenini yansıtır. Sıralamaya ihtiyacın varsa, sıralı bir harita/ağaç veya ekleme sıralı bir harita gibi bir yapı kullan (örneğin Python'ın dict'i ekleme sırasını korur, ama bu dilin bir garantisidir, hash tablosunun doğal bir özelliği değildir). Dil açıkça söz vermedikçe, yineleme sırasının anahtarları eklediğin şekle uyduğunu asla varsayma.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA