Desen içindeki tekrar bilgisini önceden çıkararak metin imlecini geri almadan desen arar.
Knuth-Morris-Pratt algoritması, kaba kuvvet aramada oluşan “false start” durumlarını desenin kendi yapısını kullanarak azaltır. Bir uyuşmazlık olduğunda metinde geriye dönmek yerine, desenin hangi önek/sonek bilgisinin korunabileceğini gösteren failure tablosuna geçilir.
Sedgewick, KMP’nin özellikle kendini tekrar eden desenlerde ve büyük dosya/akış üzerinde değerli olduğunu vurgular: metin imleci geri alınmadığı için karmaşık tamponlama gerektirmez. Ön işlem desene bağlıdır; arama ise metin üzerinde tek yönlü ilerler.
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 buildLps(pattern: string): number[] {2 const lps = Array(pattern.length).fill(0);3 let length = 0;4 let index = 1;56 while (index < pattern.length) {7 if (pattern[index] === pattern[length]) {8 length += 1;9 lps[index] = length;10 index += 1;11 } else if (length > 0) {12 length = lps[length - 1];13 } else {14 lps[index] = 0;15 index += 1;16 }17 }1819 return lps;20}2122function kmpSearch(text: string, pattern: string): number {23 if (pattern.length === 0) return 0;2425 const lps = buildLps(pattern);26 let textIndex = 0;27 let patternIndex = 0;2829 while (textIndex < text.length) {30 if (text[textIndex] === pattern[patternIndex]) {31 textIndex += 1;32 patternIndex += 1;3334 if (patternIndex === pattern.length) {35 return textIndex - patternIndex;36 }37 } else if (patternIndex > 0) {38 patternIndex = lps[patternIndex - 1];39 } else {40 textIndex += 1;41 }42 }4344 return -1;45}Metin ve deseni | ile ayırın. Örnek: ababcabcabababd | ababd
Metin ve deseni | ile ayırın. Örnek: ababcabcabababd | ababd
En İyi Durum: O(n + m)
Ortalama Durum: O(n + m)
En Kötü Durum: O(n + m)
O(m) - Bu algoritmanın karmaşıklığı belirtilmemiş.
Knuth-Morris-Pratt String Search Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar:
Rolling hash ile eşit uzunluktaki pencereleri hızlı karşılaştırır.
Deseni sağdan sola tarayıp kötü karakter/iyi sonek atlamaları kullanır.
Her olası başlangıç pozisyonunda deseni doğrudan karşılaştırır.