En hızlı dize arama algoritması olan bir süre sıkışıp kaldım, birçok fikir duydum, ama sonunda emin değilim.
Bazılarının en hızlı algoritmanın Boyer-Moore olduğunu ve bazılarının Knuth-Morris-Pratt'ın aslında daha hızlı olduğunu söylediğini duydum.
Her ikisinde de karmaşıklığı aradım ama çoğunlukla aynı görünüyorlar O(n+m)
. En kötü senaryoda Boyer-Moore'un O(nm)
O (m + 2 * n) 'ye sahip Knuth-Morris-Pratt ile karşılaştırıldığında bir karmaşıklığa sahip olduğunu buldum . Burada n = metin uzunluğu ve m = desen uzunluğu.
Galil Kuralı'nı kullanırsam, Boyer-Moore'un bildiğim kadarıyla en kötü durumdayım.
Benim sorum olan her şeyden öte, aslında en hızlı String arama algoritması (Bu soru sadece Boyer-Moore ve Knuth-Morris-Pratt'ı değil tüm olası sting algoritmalarını içerir).
Düzenleme: Bu cevap nedeniyle
Tam olarak aradığım şey:
Bir metin T
ve desen göz önüne alındığında P
, P
içindeki tüm görünüşleri bulmak zorundayım T
.
Ayrıca, P ve T'nin uzunluğu kaynaklıdır [1,2 000 000]
ve programın 0.15 sn'nin altında çalışması gerekir.
KMP ve Rabin-Karp'ın problemden% 100 puan alması için yeterli olduğunu biliyorum ama bir tanesi için Boyer-Moore'u denemek ve uygulamak istedim. Bu tür kalıp arama için hangisi en iyi olur?