Hash Tablosu
- İngilizcesi
- Hash Table
- Türkçe karşılığı
- karma tablo
- Okunuşu
- heş teybıl
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Hash tablosu, anahtar-değer çiftlerini saklayan ve hash fonksiyonuyla herhangi bir anahtarın değerini ortalamada sabit sürede bulan bir veri yapısıdır.
Hash tablosu (hash table) nedir?
Hash tablosu, bir kullanıcı adının bir kullanıcı profiline eşlenmesi gibi anahtar-değer çiftleri halinde veri saklar. İçeride, çoğunlukla bucket (kova) adı verilen yuvalardan oluşan bir dizi tutar. Bir çift eklediğinizde bir hash fonksiyonu anahtarı bir sayıya dönüştürür; bu sayının dizi boyutuna göre modülü (ona bölündükten sonra kalan) çiftin hangi bucket'a gideceğine karar verir.
Daha sonra bir anahtarı aramak için tablo onu yeniden hash'ler ve her kaydı taramak yerine doğrudan doğru bucket'a atlar; bu yüzden arama, ekleme ve silme ortalamada O(1) sürer. Bazen iki farklı anahtar aynı bucket'a düşer; buna çakışma (collision) denir. Tablolar çakışmaları bucket başına küçük bir liste tutarak (chaining) ya da bir sonraki boş yuvayı arayarak (open addressing) ele alır ve bucket'lar kısa kalsın diye çok dolduklarında büyüyüp tüm kayıtları yeniden hash'ler. Nadir en kötü durumda, birçok anahtar çakıştığında tek bir işlem O(n)'e kadar düşebilir.
Bir kütüphane iyi bir benzetmedir: her rafı kontrol etmek yerine bir kitabın yer numarasını kullanarak doğrudan doğru yere yürürsünüz. Hash tabloları en yaygın kullanılan veri yapıları arasındadır; Python'ın dict ve set yapıları ile JavaScript'in Map ve Set yapıları bunların üzerine kuruludur. Önbelleklere, sayma ve tekilleştirmeye, veritabanlarındaki hash indekslerine ve derleyicilerin değişken adlarını izlemek için kullandığı sembol tablolarına güç verirler.
Hash tablosu, güvenlik amaçlı hash'leme ile aynı şey değildir. Hash tablosunun hızlı olan ve anahtarları eşit dağıtan bir hash fonksiyonuna ihtiyacı varken, parola saklama kasıtlı olarak yavaş ve tersine çevrilmesi zor bir kriptografik hash gerektirir. Hash tabloları ayrıca dengeli arama ağaçlarıyla karşılaştırılır: tam anahtarla aramalarda hash tablosu daha hızlıdır, ancak anahtarları sıralı tutmaz; bu yüzden A ile F arasındaki tüm adları bulmak gibi aralık sorguları için ağaç daha iyi bir seçimdir.
Bir bakışta
Önemli noktalar
- Hash tablosu, bir hash fonksiyonu kullanarak anahtarları değerlere eşler.
- Arama, ekleme ve silme ortalamada O(1), en kötü durumda O(n)'dir.
- Çakışma iki anahtarın aynı bucket'a eşlenmesidir; chaining ve open addressing bunu çözer.
- Python'ın
dictyapısı ve JavaScript'inMapyapısı hash tablolarıdır. - Hash tabloları anahtarları sıralı tutmaz, bu yüzden aralık sorguları için uygun değildir.
Örnek
# A dict is Python's built-in hash table
text = "the cat sat on the mat by the door"
counts = {}
for word in text.split():
counts[word] = counts.get(word, 0) + 1 # lookup and insert: O(1) on average
print(counts["the"]) # 3
print("dog" in counts) # False: membership checks are also O(1) on averageSık sorulan sorular
Hash table ile hash map arasındaki fark nedir?
Çoğu bağlamda aynı şey anlamına gelirler: hash'leme üzerine kurulu bir anahtar-değer yapısı. Bazı diller bu adları belirli sınıflar için kullanır; örneğin Java'nın Hashtable ve HashMap sınıfları, iş parçacığı güvenliği gibi ayrıntılarda farklılaşır.
Hash tablosunda arama neden O(1)'dir?
Hash fonksiyonu bir anahtarın nereye ait olduğunu doğrudan hesaplar; böylece tablo her kaydı aramak yerine o bucket'a atlayabilir. Hash fonksiyonu anahtarları eşit dağıttığı ve tablo çok dolmadan büyüdüğü sürece bu ortalamada O(1) kalır.
Herhangi bir değer hash tablosu anahtarı olarak kullanılabilir mi?
Anahtarlar hash'lenebilir olmalı ve saklanırken değişmemelidir; çünkü değişen bir anahtar farklı bir bucket'a hash'lenir ve artık bulunamaz. Python'ın string'leri, sayıları ve hash'lenebilir değerlerden oluşan tuple'ları dict anahtarı olarak kabul edip listeleri kabul etmemesinin nedeni budur.
İlgili sayfalar
- HashingGüvenlik, s. 12Hashing, bir girdiyi tek yönlü bir fonksiyonla sabit uzunlukta bir değere dönüştürmektir; veri bütünlüğünü doğrulamaya ve parolaları güvenle saklamaya yarar.
- DiziProgramlamanın Temelleri, s. 15Dizi, tek bir ad altında saklanan ve her öğesine genellikle 0'dan başlayan indeks adlı sayısal konumuyla erişilen, sıralı bir değerler koleksiyonudur.
- ÖnbellekBackend ve API'ler, s. 34Önbellek, sık kullanılan verilerin kopyalarını tutan hızlı ve geçici bir depolama katmanıdır; sonraki istekler yavaş işi tekrarlamadan hızla karşılanır.
- Veritabanı İndeksiVeritabanları, s. 38Veritabanı indeksi, tüm tabloyu taramadan satırları hızla bulmayı sağlayan, bir kitabın sonundaki dizine benzeyen bir veri yapısıdır.
- Big O gösterimiProgramlamanın Temelleri, s. 4Big O gösterimi, girdi büyüdükçe bir algoritmanın çalışma süresinin ya da bellek kullanımının nasıl arttığını, kesin hız yerine büyüme oranıyla anlatır.
- AğaçVeri Yapıları, s. 2Ağaç, kenarlarla bağlı düğümlerden oluşan hiyerarşik bir veri yapısıdır; en üstte tek bir kök düğüm ve altında dallanan çocuk düğümler bulunur.
- Hash ÇakışmasıVeri Yapıları, s. 17Hash çakışması, iki farklı girdinin aynı hash değerine ya da kovaya düşmesidir; hash tabloları bunu ele alır, kriptografik hash'lerde pratikte bulunamamalıdır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin