2016-01-19 10 views
6

n uzunluğunda bir dizi verildiğinde, s içinde O (n) 'de farklı alt dizelerin sayısını saymak mümkün mü?O (n) 'de bir dizede farklı alt dizelerin sayısını saymak mümkün mü?

Örnek

Girdi: abb

Çıktı: 5 ('abb', 'ab', 'bb', 'a', 'b')

biraz araştırma yaptım ama böyle bir in bu sorunu çözer bir algoritma bulmak gibi olamaz verimli yol Bir O (n^2) yaklaşımın mümkün olduğunu biliyorum, ancak daha verimli bir algoritma var mı?

Her bir alt dizgiyi, yalnızca farklı olanların (fark yaratması durumunda) toplam sayısını almam gerekmez.

+0

'ba' abb'nin bir alt dizesi değil. – gnasher729

+0

@ gnasher729 Haklısınız, birisi daha önce düzenledi. – donrondon

+0

Bu sorunun burada olması gerektiğini düşünüyorum: https://cs.stackexchange.com/ – ChaosPredictor

cevap

8

Sen doğrusal zamanda bir sonek ağacı inşa etmek Ukkonen algoritmasını kullanarak Doğrusal zamanda. Tüm düğümlerdeki toplam karakter sayısıdır. Ağaçta

  /\     
      b a 
      | b 
      b b 

5 karakterden yüzden 5 altdizgelerin:

Örneğin, örnek gibi bir sonek ağacı üretir. Her benzersiz dize, farklı bir harfin ardından kök bitişinden bir yoldur: abb, ab, a, bb, b. Yani dizelerin sayısı ağaçtaki harflerin sayısıdır. Daha doğrusu

:

  • Her alt dize dize bazı sonekin öneki;
  • Tüm son ekler trie'dedir;
  • Bu yüzden, trie boyunca alt diziler ve yollar arasında 1-1 yazışma var (trie tanımıyla);
    • her biri farklı boş olmayan yol onun son harfi sonra ayrı bir pozisyonda biter; çünkü: ve
    • ağaç ve boş olmayan yollarında harfler arasında bir 1-1 yazışma vardır ve
    • her harfin aşağıdaki pozisyona yolu, O O (N^2) karakterler içeren bir ağaç inşa etmenin mümkün olabileceğini merak kişiler için

NOT benzersizdir (N) süre:

Sonek ağacının gösterimi için bir numara var. Ağacın düğümlerindeki gerçek dizeleri depolamak yerine, işaretçileri orignal dizgede saklarsınız, böylece "abb" içeren düğüm "abb" ye sahip değildir, (0,3) - 2 tamsayıya sahiptir. düğüm, her düğümdeki dizenin uzunluğu ne olursa olsun ve sonek ağacında O (N) düğümleri bulunur.

+0

Teşekkürler cevabın için. Referansladığınız wikipedia makalesi, Ukkonen'in algoritmasının O (n) zamanını sağladığını, ancak sadece sabit boyutlu alfabe için olduğunu söylüyor, bu ne anlama geliyor? Ayrıca, 's' altyazılarının sayısının neden" tüm düğümlerdeki toplam karakter sayısı "olduğunu anlamıyorum (Ukkonen'in ortaya çıkan ağacının). – donrondon

+0

"Sabit boyutlu alfabe", dizede 26 harfe veya 256 bayta veya 65536 karaktere vb. Arasından seçim yapmak için sınırlı sayıda karakterin bulunduğu anlamına gelir. Alternatif, sınırsız tam sayı tamsayıları gibi sonsuz alfabe üzerinde diziler için ek ağaçtır. . –

+0

Diğer sorunuza cevap vermek için bazı açıklamalar ekledim –

2

LCP array dosyasını oluşturun ve toplamını alt dizelerden (n (n + 1)/2) alın.

https://en.wikipedia.org/wiki/Ukkonen%27s_algorithm

s alt dizeleri sayısı sadece hesaplayabilir trie, dizeleri önekleri sayısı o zaman:

+0

O (n) 'deki LCP dizisinin nasıl oluşturulacağını açıklayabilir misiniz? Bu konuda bazı bilgiler buldum, ama ben biraz biraz kayıp. – donrondon

+0

@donrondon Ek ağacınız var mı? –

+0

O (n^2) 'de bir tane inşa etmeyi biliyorum, ancak O (n)' de değil. – donrondon

İlgili konular