Bölüm 9: Hash Tabloları

Bölüm 9: Hash Tabloları · Çalışma Soruları
Doğrusal yoklamaAyrı zincirlemeHash fonksiyonu tasarımıSilme ve mezar taşıHashMap
Klasik · çoktan seçmeli · adım adım çalıştırmalı · ucu açık sorular. Önce kendiniz çözün, sonra cevabı açın. · Sercan KÜLCÜ

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
k22113112433184231
k mod 11012020799
ek yoklama000325001
İndis012345678910
Değer22113112433–18–4231

Ö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
İndisZincir
042
122 → 1
2–
324 → 31
411 → 18
533
613

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 put değeri günceller: elma = 7, boyut 2.
  • getOrDefault: anahtar yok → 0.
  • merge: varsa eski + 1 → armut = 6.
  • 3 değeri artık yok → false.
  • put eski 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.

0123456

Önce tahmin edin: tablonun son hâli ne olur?

0123456

Boş tablo; anahtarlar 10, 3, 17, 24, 5.

0123i456

10 mod 7 = 3.

012103i456

t[3] = 10.

012103i456

3 mod 7 = 3.

0121034i56

3 dolu → i = 4.

01210334i56

t[4] = 3.

012103i3456

17 mod 7 = 3.

012103345i6

3, 4 dolu → i = 5.

01210334175i6

t[5] = 17.

012103i341756

24 mod 7 = 3.

012103341756i

3, 4, 5 dolu → i = 6.

01210334175246i

t[6] = 24.

01210334175i246

5 mod 7 = 5.

0i1210334175246

5, 6 dolu → i = 0. Sondan başa sarıldı.

50i1210334175246

t[0] = 5.

501210334175246

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?

  1. 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?
  2. 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.

Son

Bölüm 9: Hash Tabloları: Çalışma Soruları
Konu anlatımı: Hash Tabloları sunumu
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.