Ana belleğe sığmayan çok büyük veri dosyalarında disk bloklarına erişimi minimumda tutmak için kullanılan dizin tabanlı ISAM ve dinamik kova bölünmeli Extendible Hashing yöntemleridir.
Harici Arama ve Hashing yöntemleri, disk tabanlı veritabanlarında ve dosya sistemlerinde verileri organize edip hızlıca sorgulamak amacıyla kullanılır. RAM'e sığmayan verilerde ana maliyet disk okuma/yazma kafasının hareketidir.
Dizinli Sıralı Erişim (ISAM - Indexed Sequential Access Method), verileri diskte sıralı bloklar halinde tutar ve üst seviyede statik bir indeks tablosu oluşturarak aramaları ilgili bloğa yönlendirir.
Genişletilebilir Hashing (Extendible Hashing), verileri dinamik boyutlu kovalarda (buckets) saklar ve bir dizin tablosu (directory) kullanır. Bir kova dolduğunda, tüm hash tablosunun yeniden boyutlandırılması yerine sadece o kova ikiye bölünür ve dizin derinliği (global depth) 1 artırılarak dizin boyutu ikiye katlanır. Bu sayede her kayda en fazla 1 veya 2 disk erişimiyle ulaşılması garanti edilir.
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 ExtendibleBucket {2 localDepth: number = 1;3 keys: number[] = [];4 capacity: number;5 constructor(capacity: number) {6 this.capacity = capacity;7 }8}910class ExtendibleHashingSimulator {11 globalDepth: number = 1;12 directory: ExtendibleBucket[];13 bucketCapacity: number;1415 constructor(capacity: number) {16 this.bucketCapacity = capacity;17 this.directory = [18 new ExtendibleBucket(capacity), // 019 new ExtendibleBucket(capacity) // 120 ];21 }2223 insert(key: number, trace: string[]) {24 const hashBits = key % 32; // Simüle hash25 let idx = hashBits & ((1 << this.globalDepth) - 1);26 let bucket = this.directory[idx];2728 trace.push(`${key} ekleniyor (Hash bitleri: ${hashBits.toString(2)}). Hedef Kova indeksi: ${idx}`);2930 if (bucket.keys.length < this.bucketCapacity) {31 bucket.keys.push(key);32 trace.push(`Kova dolmadığı için eleman eklendi. Kova içeriği: [${bucket.keys.join(', ')}]`);33 return;34 }3536 // Kova Dolu, Bölünme gerek37 trace.push(`Kova dolu! Kova bölünmesi başlatılıyor (Local depth: ${bucket.localDepth}, Global depth: ${this.globalDepth})`);3839 if (bucket.localDepth === this.globalDepth) {40 // Dizin genişletme41 trace.push(`Local depth === Global depth olduğundan dizin ikiye katlanıyor.`);42 const oldSize = this.directory.length;43 for (let i = 0; i < oldSize; i++) {44 this.directory.push(this.directory[i]);45 }46 this.globalDepth++;47 }4849 // Yeni kova oluştur50 const newBucket = new ExtendibleBucket(this.bucketCapacity);51 bucket.localDepth++;52 newBucket.localDepth = bucket.localDepth;5354 // Elemanları yeniden dağıt55 const allKeys = [...bucket.keys, key];56 bucket.keys = [];5758 const mask = 1 << (bucket.localDepth - 1);59 const dIdx = hashBits & ((1 << this.globalDepth) - 1);6061 // Dizin göstergelerini güncelle62 const dirSize = this.directory.length;63 for (let i = 0; i < dirSize; i++) {64 if (this.directory[i] === bucket) {65 if ((i & mask) !== 0) {66 this.directory[i] = newBucket;67 }68 }69 }7071 // Dağıt72 for (const k of allKeys) {73 const kHash = k % 32;74 const kIdx = kHash & ((1 << this.globalDepth) - 1);75 this.directory[kIdx].keys.push(k);76 }7778 trace.push(`Yeniden dağıtım tamamlandı. Global Depth: ${this.globalDepth}`);79 }80}Kova kapasitesini ve eklenecek anahtarları noktalı virgülle ayırarak girin. Örnek: 2; 4, 7, 24, 16, 10, 15
Kova kapasitesini ve eklenecek anahtarları noktalı virgülle ayırarak girin. Örnek: 2; 4, 7, 24, 16, 10, 15
En İyi Durum: O(1)
Ortalama Durum: O(1)
En Kötü Durum: O(1) disk erişimi
O(n) kova ve dizin tablosu - Bu algoritmanın karmaşıklığı belirtilmemiş.
Harici Arama ve Hashing (External Searching & Hashing) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: