讓lcp
是生成兩個列表之間的最長公共前綴數的函數。生成列表與其所有後綴之間的所有最長公共前綴
例如lcp [1;2;3;1;2] [1;2] = 2
。
對於給定的列表,它有n
非空後綴,包括它本身。
例如,
的所有後綴[1; 2; 1 3]:
[1; 2; 3]
[2; 3]
[3]
這裏的問題是生成list
和all its own suffixes
之間的所有lcp
。
這裏我們談論的是A和A的所有後綴。沒有列表B存在。
例如,用於列表[1;2;3]
,我想值的列表和每個值是
分別llcp [1;2;3] [1;2;3]
llcp [1;2;3] [2;3]
llcp [1;2;3] [3]
。即,結果應該是[3; 0; 0]
它是直接使用蠻力,但它採取O(n^2)
。
如何在O(n)?不要使用後綴樹或後綴數組。
編輯
我認爲這是絕對有可能做到爲O(n)。我還沒有完全弄清楚,但是我發現了一些有趣的東西。
例如,我們有[x1;x2;x3;x4;x5;x6]
,那麼它的所有後綴
row1: [x1;x2;x3;x4;x5;x6]
row2: [x2;x3;x4;x5;x6]
row3: [x3;x4;x5;x6]
row4: [x4;x5;x6]
row5: [x5;x6]
row6: [x6]
我們的目標是計算
lcp row1 row1
(顯然是N)
lcp row1 row3
lcp row1 row4
lcp row1 row5
lcp row1 row6
所以讓我們嘗試第一。
如果我們說lcp row1 row2 = 3
,這意味着x1=x2; x2=x3; x3=x4; x4<>x5
,對吧?
那麼我們可以從上面的比較中得到什麼?
我們可以知道
x1 = x3; x2 = x4; x3 <> x5
,對不對?那麼馬上我們得到lcp row1 row3 = 2
,對吧?x1 = x4; x2 <> x5
,對不對?然後立即lcp row1 row4 = 1
x1 <> x5
,然後立即lcp row1 row5 = 0
而且只有lcp row1 row6
剩下要做的。
這裏的關鍵我想是平等轉讓,也可以不均通過局部平等信息
Java標記與一個非常算法化的問題有什麼關係? – thermz
@thermz幫助獲得更多關注?以防萬一一個不關心算法的優秀java程序員碰巧知道這個問題的解決方案? –
我真的懷疑你可以在'O(n)'中做到這一點。當遍歷滿足時,每次都放棄第一個元素,但這是最重要的元素(因爲它是前綴的「錨點」)。看起來兩個連續的lcp調用之間沒有關係,您可以利用它們來達到線性時間。 –