Bağlı listeler kullanmadan çakışmaları çözmek için boş hücreleri doğrusal sonda (Linear Probing) veya ikincil hash adımlarıyla (Double Hashing) tarayan yöntemdir.
Açık Adreslemeli Hashing (Open Addressing), hash tablolarında çakışmaları çözmek için harici bağlı listeler (chaining) kullanmak yerine, tüm elemanları tablonun kendi hücrelerinde saklar.
Çakışma anında boş bir yer bulana kadar tablodaki diğer indeksler taranır. Doğrusal Sonda (Linear Probing), çakışma indeksinden başlayarak sırayla birer birer ilerler (`index = (hash + i) % size`). Ancak bu yöntem ardışık dolu hücrelerden oluşan "birincil kümelenme" (primary clustering) sorununa yol açar.
Çift Hashing (Double Hashing) ise bu sorunu çözmek için adımlama boyutunu ikinci bir bağımsız hash fonksiyonuyla hesaplar (`index = (hash1 + i * hash2) % size`). Böylece her anahtar için farklı bir tarama sırası oluşur ve kümelenme önlenir.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1class OpenAddressingHashTable {2 size: number;3 table: (number | null)[];45 constructor(size: number) {6 this.size = size;7 this.table = Array(size).fill(null);8 }910 insertLinearProbing(key: number, trace: string[]) {11 let i = 0;12 const h = key % this.size;13 trace.push(`Linear Probing: ${key} ekleniyor. İlk hash indeksi: ${h}`);1415 while (i < this.size) {16 const idx = (h + i) % this.size;17 if (this.table[idx] === null) {18 this.table[idx] = key;19 trace.push(` Boş hücre bulundu! İndeks ${idx} doldu.`);20 return;21 }22 trace.push(` Çakışma! İndeks ${idx} dolu (${this.table[idx]}). Sonraki indeks aranıyor.`);23 i++;24 }25 trace.push('Tablo tamamen dolu, eklenemedi!');26 }2728 insertDoubleHashing(key: number, trace: string[]) {29 let i = 0;30 const h1 = key % this.size;31 const h2 = 1 + (key % (this.size - 2)); // size asal olmalıdır32 trace.push(`Double Hashing: ${key} ekleniyor. h1=${h1}, h2 (adım)=\u0024{h2}`);3334 while (i < this.size) {35 const idx = (h1 + i * h2) % this.size;36 if (this.table[idx] === null) {37 this.table[idx] = key;38 trace.push(` Boş hücre bulundu! İndeks ${idx} doldu.`);39 return;40 }41 trace.push(` Çakışma! İndeks ${idx} dolu (${this.table[idx]}). h2 (${h2}) adımı ile aranıyor.`);42 i++;43 }44 trace.push('Tablo tamamen dolu, eklenemedi!');45 }46}Tablo boyutu (asal olması önerilir) ve eklenecek sayıları girin. Örnek: 7; 12, 19, 26, 5
Tablo boyutu (asal olması önerilir) ve eklenecek sayıları girin. Örnek: 7; 12, 19, 26, 5
En İyi Durum: O(1)
Ortalama Durum: O(1 / (1 - alpha))
En Kötü Durum: O(n)
O(size) - Bu algoritmanın karmaşıklığı belirtilmemiş.
Açık Adreslemeli Hashing (Open Addressing Hashing) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: