En uzun yinelenen alt diziyi bulmak


9

Bir dize göz önüne alındığında , en uzun yinelenen (en az iki kez) sonraki bulmak istiyorum. Kendisine, bir dizi bulmak istiyoruz bir sekans olan (a bitişik olmak zorunda değildir) bu şekilde . Yani , yarıları üst üste iki kez görünen bir dizedir. Not bu bir sekans olan zorunlu bir alt, ama.swsw=wwwws

Örnekler:

'Ababccabdc' için 'abcabc' olacaktır, çünkü 'abc' = 'abc' ve 'abc' (ababccabdc) 'de en az iki kez görünür.

'Addbacddabcd' için bir seçenek 'dddd' çünkü 'dd' iki kez görünüyor (aynı mektubu birkaç kez kullanamıyorum, ama burada 4 'd's var tamam), ama lebngth 4. Daha iyi bir tane bulabilirim 'abcd', çünkü 'abcd' iki kez görünen 'addbacddabcd' nin bir alt dizesidir.

En uzun yinelenen alt diziyi bulmak istiyorum. Buna "en uzun / en büyük kareyi bulma" da denir, ancak alt dizge için bir karenin bir alt dizge için tanımlandığı birçok makaleyi okudum.

Dizede bir kesme noktası için tüm seçenekleri yineleyerek alacak bir kaba kuvvet algoritması kolayca kullanabilirim ve sonra en büyük / en uzun ortak alt diziyi arayacağım iki dizeye sahip olacağım, ancak her kontrol dinamik bir programlama tekniği kullanarak alacaktır , bu nedenle tüm zaman . En uzun ortak takip için alan daha verimli bir algoritma buldum , böylece çalışma süresi .O(n3)O(n2)O(n3)O(n2logn)O(n3logn)

En uzun yinelenen sonraki problem için daha verimli bir algoritma arıyorum. Belki de tüm kesme noktalarında yineleme fikrim çok fazla zaman harcıyor ve daha az yinelemeye indirgenebiliyor. Ya da belki de farklı bir tutuma sahip bir algoritma bu sorunu çözebilir.

Birçok dergi ve önceki soruları araştırdım ve bulduğum sonuçların çoğu bir alt diziyle ilgili ve bir alt diziyle ilgili değildi.

Ben de bu sonek ağaçları kullanılarak yapılabilir, ama bu da alt dizeleri ile ilgili ve ben böyle bir fikir sonraki için genişletilebilir olup olmadığını emin değilim.

Zaman içinde çalışan bir çözüm arıyorum . Zaman içinde bir tane varsa daha iyi olacaktır (böyle olup olmadığından emin değilim).O(n2)O(nlogn)


4
Son ek ağaçlarına veya son dizilere bakın.
Takma isim

1
Çok olasılığının düşük olması bir ortaya çıksa, iki uzunluk- ait LCS bulmak için en iyi bilinen algoritma yenmek için kullanabilir beri -zaman algoritması, bu problem bulunmaktadır dizeleri ve aşağıdaki gibi: dize Form nerede, ise bir karakterin kopyaları ya görünmüyor veya sizin çalıştırmak sonra, ve üzerinde -zaman algoritması. En uzun yinelenen dizinin her iki "yarısı" mutlaka ile başlayacaktır , bu nedenle ve her birinden birer tane geliro(n2)nuvxuxvxn+1$uvo(n2)xuv, LCS problemini çözer.
j_random_hacker

@j_random_hacker LCS, Sonek Ağacı kullanılarak veya haddeleme karma kullanarak içinde çözülebilir . O(n+m)O(nlogn)
Kötülük

@Evil: Henüz nasıl göründüğümü bilmiyorum, biraz daha ayrıntı verebilir misiniz? ( Bu zaman karmaşıklıklarında çözülebilecek En Uzun Ortak Alt dizeyi düşünmediğinizden emin misiniz ?)
j_random_hacker

@j_random_hacker Amaçlanan LCS (ardışık ile karşılaştırdığınızı sanıyordum , ama burada, belirttiğiniz gibi, evet, En Uzun Yaygın Subsequence için n ^ 2'de çalışma çözümü görmedim (buldum indirilen cevaba benzer şekilde, hatalı olan birçok sayfaya yayılan bir dinamik programlama kodu). Sadece yorumunu yanlış anladım, üzgünüm. o(n2)
Kötülük

Yanıtlar:


-1

İşte dinamik bir programlama çözümü.

Giriş dizesinin olduğunu varsayalım . Bir tablo oluşturma olan satırlar ve sütunlar ile endekslenir (burada kural tarafından doldurulan, dizgenin uzunluğudur) Cevap .x1xnT0,,nn

T[i,j]={0if i=0 or j=0,T[i1,j1]+1if xi=xj and ij,max(T[i1,j],T[i,j1])otherwise.
T[n,n]

Bazı altındadır varsayalım ile , ve koşul deyimi doğrudur. Ardından , konumundaki karakterin her iki alt dizinin bir parçası olduğunu ima eder . i,ji=j+1ifdp[i][j] = dp[i - 1][j - 1] + 1i1=j
j_random_hacker

3
Bilgisayar Bilimine Hoşgeldiniz! Lütfen kaynak koddan kurtulun ve fikirleri, sözde kodu ve doğruluk argümanlarıyla değiştirin. İlgili meta tartışmalar için buraya ve buraya bakın .
Raphael

@Raphael Özyinelemeli bir formül kaynak kodu olarak sayılmaz.
Aralık'ta 945 Sayı

1
@BreakingBenjamin Tercih ettiğiniz dile bağlı olarak, verilen yinelemeyi tam anlamıyla veya daha az yazabilirsiniz. Mesele şu ki burada bir açıklama yok.
Raphael
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.