Uzunluğu iki şeritleri k bir karakter bakımından farklı, uzunluğu bir önek paylaşan l ve uzunluk bir eki m , öyle ki , k = l + m + 1 .
Simon Prins tarafından cevap tüm ön / son ek kombinasyonları açıkça, yani depolayarak bu kodlar abc
olur *bc
, a*c
ve ab*
. Bu k = 3, l = 0,1,2 ve m = 2,1,0.
ValarMorghulis'in işaret ettiği gibi, bir önek ağacındaki kelimeleri düzenleyebilirsiniz. Çok benzer ek ağacı da var. Her ön ekin veya son ekin altındaki yaprak düğümlerinin sayısı ile ağacı büyütmek oldukça kolaydır; bu, yeni bir kelime eklenirken O (k) olarak güncellenebilir.
Bu kardeş sayımlarını istemenin nedeni, yeni bir sözcük verdiğinizde, tüm önekleri aynı önekle numaralandırmak isteyip istemediğinizi veya tüm ekleri aynı sonekle numaralandırmak isteyip istemediğinizi bilmenizdir. Örneğin giriş olarak "abc" için, olası önekler "", "a" ve "ab" iken karşılık gelen sonekler "bc", "c" ve "" şeklindedir. Açıkça görüldüğü gibi, kısa ekler için önek ağacındaki kardeşleri numaralandırmak ve tersini yapmak daha iyidir.
@Einpoklum'un belirttiği gibi, tüm dizelerin aynı k / 2 önekini paylaşması kesinlikle mümkündür . Bu yaklaşım için sorun değil; önek ağacı k / 2 derinliğine kadar doğrusal olacak ve her bir düğüm k / 2 derinliğine kadar 100.000 yaprak düğümünün atası olacaktır. Sonuç olarak, sonek ağacı (k / 2-1) derinliğe kadar kullanılacaktır, bu da iyidir çünkü dizeler önekleri paylaştıklarından soneklerinde farklılık göstermek zorundadır.
Bir optimizasyon olarak, bir dizenin en kısa benzersiz önekini belirledikten sonra, farklı bir karakter varsa , önekin son karakteri olması gerektiğini ve kısa olan bir öneki denetleme. Yani "abcde" en kısa benzersiz öneki "abc" içeriyorsa, "ab?" İle başlayan başka dizeler de var demektir. "abc" ile değil. Yani, sadece bir karakterden farklı olsaydı, bu üçüncü karakter olurdu. Artık "abc? E" yi kontrol etmenize gerek yok.
Aynı mantıkla, "cde" nin benzersiz bir en kısa sonek olduğunu görürseniz, uzunluk 1 veya 3 öneklerini değil, yalnızca uzunluk-2 "ab" önekini kontrol etmeniz gerektiğini bilirsiniz.
Bu yöntemin yalnızca bir karakter farklılığı için işe yaradığını ve 2 karakter farklılığını genelleştirmediğini, bir karakteri aynı öneklerle özdeş sonekler arasındaki ayrım olarak kullandığını unutmayın.