Menu
Coddy logo textTech

Hash Map

Son güncelleme

Bir hash map anahtar-değer çiftlerini saklar ve bir değeri anahtarına göre ortalama O(1) sürede aramanıza olanak tanır. Tam olarak bir hash tablosu gibi çalışır, ancak her kova girdisi hem bir anahtarı hem de ona bağlı değeri taşır. Bir çifti saklamak veya getirmek için anahtar bir kova indeksine hash'lenir, ardından eşleşen anahtar için o kovanın zinciri taranır. Çiftlerin hash'lenmiş kovaya yerleştirilmesini ve bir değerin anahtarına göre getirilmesini izlemek için yukarıdaki oynat düğmesine basın.

Bu, Python'daki dict, Java'daki HashMap ve JavaScript'teki Map/nesnelerin arkasındaki yapıdır. Çakışmalar bir hash tablosundaki gibi ele alınır - burada ayrık zincirleme ile - bu yüzden performans iyi bir hash fonksiyonuna ve düşük bir yük faktörüne bağlıdır.

Zaman karmaşıklığı

İşlemOrtalamaEn kötü durum
Ekle/güncelle (put)O(1)O(n)
Ara (get)O(1)O(n)
SilO(1)O(n)
AlanO(n)O(n)

Yaygın dillerde hash map

DilTür
Pythondict
JavaHashMap
JavaScriptMap / nesne
C++std::unordered_map
Gomap

Çözümlü örnek

("cat", 3), ("dog", 5), ("cat", 9), ("emu", 7) çiftlerinin 8 kovalı bir haritaya hash(key) % 8 kullanılarak eklenmesi. hash("cat") % 8 = 2, hash("dog") % 8 = 5, hash("emu") % 8 = 2 olduğunu varsayalım:

AdımYapıİşlem
Put ("cat", 3)kova 2: [("cat", 3)]Kova 2'ye hash'lenir; zincir boş, bu yüzden çift eklenir.
Put ("dog", 5)kova 2: [("cat", 3)], kova 5: [("dog", 5)]Kova 5'e hash'lenir; zincir boş, bu yüzden çift eklenir.
Put ("cat", 9)kova 2: [("cat", 9)], kova 5: [("dog", 5)]Kova 2'ye hash'lenir; "cat" anahtarı zaten zincirde, bu yüzden değeri 9 olarak güncellenir.
Put ("emu", 7)kova 2: [("cat", 9), ("emu", 7)], kova 5: [("dog", 5)]Kova 2'ye hash'lenir; "cat" ile çakışır, anahtar bulunamaz, bu yüzden çift eklenir.
Get "emu"kova 2: [("cat", 9), ("emu", 7)]Kova 2'ye hash'lenir; zincir taranır, "cat" atlanır, "emu" eşleşir, 7 döndürülür.

Ne zaman hash map kullanmalı

Şu durumda kullanınŞu durumda kaçının
Kesin bir anahtara göre ortalama O(1) arama, ekleme ve silme gerektiğinde.Anahtarları sıralı tutmanız veya aralık sorguları gerektiğinde - dengeli bir BST veya sıralı harita kullanın.
Anahtarlar hash'lenebilir ve eşitlik iyi tanımlıysa (dizgeler, tam sayılar, demetler).Anahtarlar değişebilir ve eklemeden sonra değişebiliyorsa, bu da kovalarını bozar.
Bir tanımlayıcıya göre sayım, tekilleştirme, önbellekleme veya indeksleme yapıyorsanız.Amortize edilmiş ortalama sınırlar yerine en kötü durum O(log n) garantileri gerektiğinde.
Yineleme sırası önemli değilse veya ekleme sıralı bir harita yeterliyse.Bellek çok kısıtlıysa - kovalar, yük faktörü payı ve işaretçiler ek yük getirir.

Hash Map kodu

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

Python ile Hash Map kodu

Python
1# Python's built-in dict is a hash map: O(1) average2# insert, lookup, and delete.3inventory = {"apple": 3, "banana": 7}4
5# Insert and update6inventory["cherry"] = 57inventory["apple"] += 28
9# Lookup, with .get for a safe default on missing keys10print("apple: ", inventory["apple"])11print("mango: ", inventory.get("mango", 0))12
13# Membership test and delete14print("banana in stock:", "banana" in inventory)15del inventory["banana"]16print("banana in stock:", "banana" in inventory)17
18# Iterate over key-value pairs19for fruit, count in sorted(inventory.items()):20    print(f"{fruit}: {count}")21
22# Classic hash map use case: counting frequencies23words = "the quick brown fox jumps over the lazy dog the end".split()24freq = {}25for word in words:26    freq[word] = freq.get(word, 0) + 127
28print("Occurrences of the:", freq["the"])29print("Most common word:  ", max(freq, key=freq.get))
Bu kodu Python Playground'da çalıştır

Hash Map SSS

Hash map ile hash tablosu arasındaki fark nedir?
Esasen aynı yapıdır - anahtarın hash'iyle adreslenen bir kovalar dizisi. Yaygın kullanımda "hash tablosu" genellikle bir anahtar kümesine veya genel tekniğe atıfta bulunurken, "hash map" anahtar-değer çiftlerini saklamayı vurgular. Bazı diller ayrıca bir iş parçacığı güvenliği ayrımı da yapar (örneğin Java'da Hashtable ve HashMap), ancak temel algoritma aynıdır.
Bir hash map'in zaman karmaşıklığı nedir?
Put, get ve delete iyi bir hash fonksiyonu ve düşük bir yük faktörü ile ortalama O(1)'dir. Tüm anahtarların tek bir kovada çakıştığı patolojik durumda O(n)'e düşerler, bu yüzden yeniden boyutlandırma ve iyi hashing önemlidir.
Bir hash map, aynı kovaya hash'lenen iki anahtarı nasıl ele alır?
Çakışmayı çözer. Bu görselleştirme ayrık zincirleme kullanır: her kova küçük bir liste tutar ve anahtarı oraya hash'lenen yeni bir çift o listeye eklenir. Aramada harita, eşleşen anahtar için kısa zinciri tarar. Alternatif teknik, dizide başka bir yuva araştıran açık adreslemedir.
Hash map ve ikili arama ağacı: hangisini kullanmalıyım?
Yalnızca kesin anahtara göre arama gerektiğinde ve ortalama O(1) işlemler istediğinizde bir hash map kullanın. Sıralı anahtarlar, aralık sorguları veya öncül/ardıl aramaları gerektiğinde dengeli bir ikili arama ağacı (TreeMap veya std::map gibi) kullanın; bunlar O(log n) maliyetlidir. BST, bir hash map'in sağlayamayacağı sıralama garantileri için biraz hızdan ödün verir.
Yük faktörü nedir ve neden yeniden boyutlandırmayı tetikler?
Yük faktörü, saklanan girdilerin kovalara oranıdır. Yükseldikçe zincirler uzar ve ortalama aramalar yavaşlar, bu yüzden çoğu uygulama 0.75 gibi bir eşiği aştığında yeniden boyutlandırır (tipik olarak kovaları ikiye katlar ve her şeyi yeniden hash'ler). Yeniden boyutlandırma O(n)'dir ama nadirdir, bu yüzden amortize edilir ve ortalama işlemleri O(1)'de tutar.
Liste gibi değiştirilebilir bir nesneyi hash map anahtarı olarak kullanabilir miyim?
Genellikle hayır. Anahtarlar hash'lenebilir olmalı ve haritadayken hash'leri sabit kalmalıdır - örneğin Python bir list için TypeError: unhashable type fırlatır. Bir anahtarı ekledikten sonra değiştirirseniz, hash'i değişir ve harita onu artık doğru kovada bulamaz, girdiyi sessizce kaybeder. Dizgeler, sayılar veya demetler gibi değişmez anahtarlar kullanın.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA