Sonek dizileri bu sorun için kullanılabilir. Sözcükbilimsel sıralamaya göre dizenin her sonekinin başlangıç konumlarını içerirler. Her ne kadar karmaşıklığında saf olarak inşa edilebilirlerse de , bunları Θ ( n ) karmaşıklığında inşa etmek için yöntemler vardır . Örneğin bu ve buna bakın . Bu sonek dizisi SA diyelim.O ( n günlüğün )Θ ( n )
Sonek dizisi oluşturulduktan sonra, sonek dizisi için bir En Uzun Ortak Önek (LCP) dizisi oluşturmamız gerekir. LCP dizisi, sonek dizisindeki iki ardışık önek (sözlükçik ardışık sonekler) arasındaki en uzun ortak önek uzunluğunu saklar. Bu nedenle, LCP [i], SA [i] ve SA [i + 1] arasındaki en uzun ortak önek uzunluğunu içerir. Bu dizi doğrusal zamanda da oluşturulabilir: bazı iyi referanslar için buraya , buraya ve buraya bakın.
Şimdi, sonek ağacındaki herhangi bir iki sonek için ortak olan en uzun ön ekin uzunluğunu hesaplamak için (ardışık sonekler yerine), bazı RMQ veri yapısını kullanmamız gerekiyor . Yukarıdaki referanslarda gösterilmiştir (ve dizi bir sonek ağacı olarak görselleştiriliyorsa kolayca görülebilir), sonek dizisinde ve v ( u < v ) konumlarına sahip iki sonek arasındaki en uzun ortak önek uzunluğunun , m i n u < = k < = v - 1 L C P [ k ] olarak elde edilebiliruvu<vminu<=k<=v−1LCP[k]. İyi bir RMQ işlem öncesi olabilir Dizi O ( n ) ya da O ( n, log n ) formunun sorguları için zaman ve cevap L Cı- P [ u , v ] içinde , O ( 1 ) zaman. Bkz burada bir succint RMQ algoritması için, ve burada RMQ en iyi bir öğretici ve LCA ve RMQs arasındaki ilişki (ve indirimleri) için. Bunun güzel bir alternatif yaklaşımı var.LCPO(n)O(nlogn)LCP[u,v]O(1)
Bu bilgilerle, iki dizenin aradaki bir sınırlayıcı ile birleştirilmesi için (yukarıda açıklandığı gibi) sonek dizisini ve ilişkili dizileri oluştururuz (örneğin T # P, her iki dizede '#' oluşmaz). Ardından, "kanguru" yöntemini kullanarak k uyuşmazlığı dizesi eşleştirmesi yapabiliriz. Bu ve bu , kanguru yöntemini sonek ağaçları bağlamında açıklar, ancak sonek dizilerine de doğrudan uygulanabilir. Her dizin için metni T bulmak L Cı- P ve ekinin T başlayan i ve son ek PiTLCPTiPBu, T [ i ] ile eşleştirirken ilk uyumsuzluğun meydana geleceği konumu verir . Bu uzunluk l 0 olsun . Hem uyuşmayan karakteri atla T ve P ve kalan dizeleri eşleştirmeye çalışın. Kendisine, yeniden bulmak L Cı- P ve T [ i + l 0 + 1 ] ve p [ l 0 + 1 ] . K uyuşmazlıkları elde edene veya dize bitene kadar bu işlemi tekrarlayın . Her biriPT[i]l0TPLCPT[i+l0+1]P[l0+1]k olan O ( 1 ) . Var O ( k ) L Cı- P ', bulunduğu her bir dizin için s ı arasında T , bu toplam karmaşıklığını veren O ( n, k ) .LCPO(1)O(k) LCPiTO(nk)
O(nk+(n+m)log(n+m))O(nk+nlogn)m=O(n)O(nk)