Desen ve metin pencerelerini rolling hash ile karşılaştırarak eşleşme adaylarını hızlı bulur.
Rabin-Karp algoritması, her m uzunluklu metin penceresini doğrudan karakter karakter karşılaştırmak yerine pencerelerin hash değerlerini karşılaştırır. Hash eşleşirse gerçek karakter karşılaştırması yapılarak çakışma olasılığı kontrol edilir.
Sedgewick’in anlatımında yöntemin ana fikri, bir pencerenin hash değerinden bir sonraki pencerenin hash değerini modüler aritmetik ile üretmektir. Böylece her kaydırmada m karakteri yeniden hesaplamak yerine sabit maliyetli rolling hash güncellemesi yapılır.
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.
1function rabinKarpSearch(text: string, pattern: string): number {2 if (pattern.length === 0) return 0;3 if (pattern.length > text.length) return -1;4 const base = 256, prime = 1_000_000_007, patternLength = pattern.length;5 let highBase = 1, patternHash = 0, windowHash = 0;6 for (let index = 0; index < patternLength - 1; index += 1) {7 highBase = (highBase * base) % prime;8 }9 for (let index = 0; index < patternLength; index += 1) {10 patternHash = (patternHash * base + pattern.charCodeAt(index)) % prime;11 windowHash = (windowHash * base + text.charCodeAt(index)) % prime;12 }13 for (let start = 0; start <= text.length - patternLength; start += 1) {14 if (patternHash === windowHash && text.slice(start, start + patternLength) === pattern) {15 return start;16 }17 if (start < text.length - patternLength) {18 const removed = text.charCodeAt(start) * highBase;19 const added = text.charCodeAt(start + patternLength);20 windowHash = (windowHash - removed) % prime;21 windowHash = (windowHash + prime) % prime;22 windowHash = (windowHash * base + added) % prime;23 }24 }25 return -1;26}Metin ve deseni | ile ayırın. Örnek: A STRING SEARCHING EXAMPLE | SEARCH
Metin ve deseni | ile ayırın. Örnek: A STRING SEARCHING EXAMPLE | SEARCH
En İyi Durum: O(n + m)
Ortalama Durum: O(n + m)
En Kötü Durum: O(nm)
O(1) - Giriş boyutu ne olursa olsun, algoritma her zaman aynı sürede çalışır.
Rabin-Karp String Search Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: