Bölüm 9: Hash Tabloları
Klasik Soru · Hash Tablosu
Soru 1: Doğrusal Yoklama
Boyutu 11 olan tabloya h(k) = k mod 11 ve doğrusal yoklama (linear probing) ile sırasıyla 22, 1, 13, 11, 24, 33, 18, 42, 31 anahtarları ekleniyor. Tablonun son hâlini ve her anahtar için çakışma (ek yoklama) sayısını bulunuz. Yük faktörü nedir?
Cevabı göster
| k | 22 | 1 | 13 | 11 | 24 | 33 | 18 | 42 | 31 |
|---|---|---|---|---|---|---|---|---|---|
| k mod 11 | 0 | 1 | 2 | 0 | 2 | 0 | 7 | 9 | 9 |
| ek yoklama | 0 | 0 | 0 | 3 | 2 | 5 | 0 | 0 | 1 |
| İndis | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Değer | 22 | 1 | 13 | 11 | 24 | 33 | – | 18 | – | 42 | 31 |
Örn. 11 → 0 dolu (22), 1 dolu, 2 dolu (13) → 3'e yerleşir. 33 → 0,1,2,3,4 dolu → 5.
Toplam ek yoklama: 11. Yük faktörü α = 9 / 11 ≈ 0,82. Doğrusal yoklamada dolu hücreler kümelenir (primary clustering); α büyüdükçe yoklama sayısı hızla artar.
Klasik Soru · Hash Tablosu
Soru 2: Ayrı Zincirleme
Aynı anahtarlar (22, 1, 13, 11, 24, 33, 18, 42, 31) boyutu 7 olan tabloya h(k) = k mod 7 ile ayrı zincirleme (separate chaining) yöntemiyle, zincirin sonuna eklenerek yerleştiriliyor. Tabloyu çiziniz. Yük faktörü 1'den büyük olabilir mi? En uzun zincir ve başarısız aramada ortalama karşılaştırma sayısı nedir?
Cevabı göster
| İndis | Zincir |
|---|---|
| 0 | 42 |
| 1 | 22 → 1 |
| 2 | – |
| 3 | 24 → 31 |
| 4 | 11 → 18 |
| 5 | 33 |
| 6 | 13 |
Yük faktörü α = 9 / 7 ≈ 1,29. Zincirlemede her hücre bir liste tuttuğu için α > 1 olabilir; açık adreslemede olamaz.
En uzun zincir: 2 (indis 1, 3, 4). Başarısız arama ortalama α ≈ 1,29 karşılaştırma ister; beklenen maliyet O(1 + α).
Klasik Soru · Hash Tablosu
Soru 3: Hash Fonksiyonu Tasarımı
15, 25, 35, 45, 55, 65, 75, 85, 95 anahtarları saklanacak.
(a) Boyutu 10 olan tabloda h(k) = k mod 10 neden kötüdür?
(b) Çakışmasız bir fonksiyon öneriniz.
(c) Tablo boyutunu 11 (asal) seçmek ne kazandırır?
(d) İyi bir hash fonksiyonunun özellikleri nelerdir?
Cevabı göster
- (a) Tüm anahtarların son basamağı 5: hepsi 5. hücreye düşer, 8 çakışma. Arama O(n)'e iner.
- (b)
h(k) = (k / 10) mod 10→ 1, 2, …, 9: çakışma yok. - (c)
k mod 11→ 4, 3, 2, 1, 0, 10, 9, 8, 7: hepsi farklı. Asal boyut, anahtarlardaki ortak çarpan ve düzenli aralıkların aynı hücrelere yığılmasını önler. - (d) Deterministik (aynı girdi → aynı çıktı), hızlı hesaplanır, anahtarları tabloya eşit dağıtır, anahtarın tüm bitlerini kullanır, küçük girdi farkı büyük çıktı farkı üretir.
Klasik Soru · Hash Tablosu
Soru 4: Açık Adreslemede Silme
Boyut 7, h(k) = k mod 7, doğrusal yoklama. Sırasıyla 10, 17, 24 eklenir, sonra 17 silinir ve ardından 24 aranır.
(a) Silinen hücre basitçe boş (null) yapılırsa arama ne döndürür?
(b) Bu sorun nasıl çözülür?
Cevabı göster
10, 17, 24 → hepsinin hash'i 3. Yerleşim: 10 → 3, 17 → 4, 24 → 5.
(a) 17 silinip hücre 4 null yapılırsa, 24 aranırken 3 (10, eşleşmez) → 4 (boş) noktasında arama durur: "bulunamadı" der. Oysa 24 hücre 5'tedir: yanlış sonuç.
(b) Silinen hücreye özel bir "silindi" (mezar taşı, tombstone) işareti konur:
- Arama mezar taşında durmaz, devam eder.
- Ekleme mezar taşı hücresini yeniden kullanabilir.
- Mezar taşları çoğalınca tablo yeniden oluşturulur (rehash).
Klasik Soru · Hash Tablosu
Soru 5: HashMap Çıktısı
Programın çıktısı nedir?
Map<String, Integer> m = new HashMap<>(); m.put("elma", 3); m.put("armut", 5); m.put("elma", 7); System.out.print(m.get("elma") + " "); System.out.print(m.size() + " "); System.out.print(m.getOrDefault("kiraz", 0)); m.merge("armut", 1, Integer::sum); System.out.print(" " + m.get("armut")); System.out.print(" " + m.containsValue(3)); System.out.print(" " + m.put("elma", 1));
Cevabı göster
- Aynı anahtarla ikinci
putdeğeri günceller: elma = 7, boyut 2. getOrDefault: anahtar yok → 0.merge: varsa eski + 1 → armut = 6.- 3 değeri artık yok → false.
puteski değeri döndürür → 7.
Çıktı: 7 2 0 6 false 7
get/put ortalama O(1); containsValue tüm tabloyu tarar: O(n).
Çoktan Seçmeli · Hash Tablosu
Test 1
Boyut 10, h(k) = k mod 10, doğrusal yoklama. Sırasıyla 12, 22, 32 eklenince 32 hangi indise yerleşir?
12 → 2, 22 → 2 dolu → 3, 32 → 2, 3 dolu → 4.
Java HashMap'in varsayılan yük faktörü eşiği (aşılınca tablo büyür) kaçtır?
α = n / m > 0,75 olunca tablo 2 katına çıkar ve tüm anahtarlar yeniden yerleştirilir (rehash).
Çoktan Seçmeli · Hash Tablosu
Test 2
Aşağıdakilerden hangisi iyi bir hash fonksiyonunun özelliği değildir?
Anahtar uzayı tablo boyutundan büyük olduğunda çakışma kaçınılmazdır (güvercin yuvası ilkesi). Amaç çakışmayı azaltmaktır, sıfırlamak değil.
Ayrı zincirlemeli bir hash tablosunda aramanın en kötü durumu nedir?
Tüm anahtarlar aynı kovaya düşerse zincir n uzunlukta olur. Java 8+ uzun zincirleri ağaca çevirerek bunu O(log n)'ye indirir.
Adım Adım Çalıştırma · Hash Tablosu
Doğrusal Yoklama
Boyut 7, h(k) = k mod 7. Anahtarların tabloya yerleşmesini ve yoklamaları izleyin.
Önce tahmin edin: tablonun son hâli ne olur?
Boş tablo; anahtarlar 10, 3, 17, 24, 5.
10 mod 7 = 3.
t[3] = 10.
3 mod 7 = 3.
3 dolu → i = 4.
t[4] = 3.
17 mod 7 = 3.
3, 4 dolu → i = 5.
t[5] = 17.
24 mod 7 = 3.
3, 4, 5 dolu → i = 6.
t[6] = 24.
5 mod 7 = 5.
5, 6 dolu → i = 0. Sondan başa sarıldı.
t[0] = 5.
Tüm anahtarların hash'i 3 veya 5: yan yana dolu hücreler kümelenir (primary clustering). Son anahtar 2 ek yoklama yaptı.
Integer[] t = new Integer[7]; int[] keys = {10, 3, 17, 24, 5}; for (int k : keys) { int i = k % 7; while (t[i] != null) i = (i + 1) % 7; t[i] = k; } System.out.println(Arrays.toString(t));
Ucu Açık Soru · Hash Tablosu
Kullanıcı Adı Müsait mi?
- Bir web sitesinde kayıt sırasında "bu kullanıcı adı alınmış mı?" kontrolü saniyede binlerce kez yapılıyor. Hangi veri yapısını kullanırsınız? Neden sıralı dizi + ikili arama değil?
- Kullanıcı sayısı 100 milyona çıkınca bellek sorun olmaya başlıyor. Hash tablosunda hangi parametreler belleği etkiler? Ne gibi çözümler önerirsiniz?
Örnek cevap ve değerlendirme ölçütleri
1. HashSet<String>: ortalama O(1) arama ve ekleme. Sıralı dizide arama O(log n) ama her yeni kayıtta araya ekleme O(n)'dir; sürekli kayıt alan sistemde uygun değildir. Büyük/küçük harf duyarsızlık için anahtar normalize edilmelidir (ör. küçük harfe çevirme).
2. Belleği etkileyenler: anahtar sayısı ve uzunluğu, yük faktörü (düşük α = çok boş kova), düğüm başına nesne ek yükü (zincirleme). Çözümler: daha yüksek yük faktörü veya açık adresleme; anahtarları özetleyip (hash) saklama; sorguyu veritabanı indeksine (B-ağacı) taşıma; önce Bloom filtresi ile hızlı "kesin yok / belki var" kontrolü yapıp yalnızca "belki var" için asıl kaynağa bakma; tabloyu birden çok sunucuya bölme (sharding).
Değerlendirme: uygun yapı ve karmaşıklık · sıralı diziyle karşılaştırma · bellek parametrelerinin bilinmesi · ölçeklenebilir en az bir çözüm.