Sonek ağaçları tüm yaygın alt dizeleri bulmak için kullanılabilir mi?


10

Dize dizileri karşılaştırmak için sonek ağaçları kullanmaya çalışıyorum. Ek ağaçları kullanarak en uzun ortak alt dize sorunu için uygulamalar / teori buldum. Ancak, ne arıyorum ilgili sorun - "tüm ortak alt dizeleri" bir tartışmadır. Özellikle, ben ilk önce en uzun ortak alt dize bulmak, sonra zaten bulunan lcs indeksleri içermeyen bir sonraki en uzun ortak alt dize bulmak gerekir bir sorun var, ve böylece minimum uzunluğa kadar. Bu sorun, Genelleştirilmiş sonek ağacını (GST) iki dizi için yalnızca bir kez oluşturarak çözülebilir mi? LCS'yi bulmanın ve çıkarmanın her yinelemesinden sonra tekrar tekrar bir GST oluşturarak çözülebileceğini biliyorum. Ancak, GST'de sadece bir kez inşa edilen düzgün bir hile eksik olup olmadığımı merak ediyorum.


Bu ilginç bir soru. Sorun biz varsa ve bulmuşlardır wrt LCS olan , biz değil kolayca "kaldırma" sonek ağacı (ya da ek dizisinden, ne olursa olsun). İlk adımdan sonra gibi bir şey istiyoruz , değil mi? β T β S = α $ γS=αβγβTβS=α$γ
Dmytro Korduban

Yanıtlar:


3

Evet, sonek ağaçları tüm yaygın alt dizeleri bulmak için kullanılabilir. Bunun yerine bir sonek dizisi kullanmayı söyleyebilirim, ancak zaten bir sonek ağacınız varsa, bir sonek ağacından bir sonek dizisi oluşturmak DFS tarafından doğrusal zaman alır. Cevabımın geri kalanı bir sonek dizisi ile çalıştığımızı varsayacaktır.

metni için bir sonek dizisi, $ dizesinin soneklerinin sözlükbilimsel sırasını belirten - aralığında bir tamsayı dizisidir. S 0 n n + 1 SS=s1,...,snS0nn+1S

Son ek dizisini en uzun yaygın önek olan birleştirmek istiyoruz . Bu dizi gerçekleştirebilmesi belirtildiği gibi lineer zamanda Kasai ve ark kağıt . Son ek diziler ve bunların LCP dizileri LCP dizi diyelim içine bir dizin verilen bir şekilde bir araya hizaya indeks numarası, daha sonra ortak alt dize ve bir örneğinin başlangıç olacaktır ikinci örneğin başlangıç ​​dizini olacaktır. Uzunluk elbette lcp dizisindeki değerdir.L C P s l c p [ k ] k s a [ k ] s a [ k - 1 ]LCPsLCPslcp[k]ksa[k]sa[k1]


3

İşe yarayabilecek bir fikrim var. ve dizileri için genelleştirilmiş bir sonek ağacıyla başlıyoruz . Her iki soneklerle Her iç düğüm ve sekanslarının bazı ortak substring olan alt ağaç tekabül etmesidir. Bu düğümleri önemsiz olarak adlandıralım. Karşılık gelen düğümün önemsiz olmayan alt öğeleri varsa, ortak alt dize maksimaldir. düğümü önemsiz değilse , önemsiz olmayan bir düğümün en büyük dize derinliğini alt ağacında olarak . Eğer kökü, daha sonra, en uzun ortak substring uzunluğu ve .T S T v l c s ( v ) r l c s ( r ) S TSTSTvlcs(v)rlcs(r)ST

Sekanslardan birinden bir alt dizeyi sildikten sonra ağacın güncellenmesi çok zor olmamalıdır. Önce silinen soneklere karşılık gelen yaprakları sileriz, gerektiğinde atalarını güncelleriz. Ardından, silinen alt dizeden önceki sonekleri işlemeye başlarız. Let akım yaprak düşük önemsiz olmayan atası. Sonekin uzunluğu ise (biz ve silinmeye karşı adım) , biz gerektiğinde ataları güncellenmesi ağacındaki uygun pozisyona soneki taşımak zorunda. Eğer , önemsiz kökleri olan alt ilgilenmiyoruz.k k k < l c s ( v ) k l c s ( v )vkkk<lcs(v)klcs(v)

Genel algoritma, ve en uzun ortak alt dizisini tekrar tekrar bulur ve LCS'nin uzunluğu yeterince büyük olduğu sürece oluşumlarından birini her iki diziden de siler.TST

Bazı teknikler var, ancak genel fikir işe yarıyor.


0

Birleştirilmiş S $ T metniyle başlayın; burada $ * veya T'de hiçbir yerde olmaz . Bu metinden bir sonek ağacı / dizi oluşturun. Tüm doğru maksimum tekrarları toplamak için bu sonek veri yapısını geçmek artık çok kolay. Sol bağlamı inceleyerek, sol olmayan maksimum tekrarları filtreleyin. Bu sol filtreleme, Abouelhoda ve arkadaşlarında olduğu gibi Burrows-Wheeler tablosu kullanılarak uygulanabilir, ancak bunun gerekli olduğuna inanmıyorum. Yalnızca S veya yalnızca T'de tekrarlarbu noktada da ortadan kaldırılmalıdır. Elimine edilmemiş tekrarlar, önceliği uzunluğa göre tanımlanan bir öncelik kuyruğuna konur. Çapraz geçişten sonra, kaydedilen tekrarlar öncelikten çıkarıldığı için, son filtreleme (alt dize tutma için) gerçekleştirilebilir. Ancak, maksimum ifadelerin kullanımı göz önüne alındığında, bu filtrelemenin çok azının gerekli olduğundan şüpheleniyorum.

Bu algoritma benim icadım. Çok zeki olarak sınıflandırmam, ama çalışması gerekir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.