給出了基於 kmp 演算法的字串重複判定思路,
但是在使用這個演算法判定乙個長度為 1024*1024*1024 的字串是否重複時(編譯為 32 位程式),記憶體爆掉了,這提示了該演算法很占用記憶體。
是的,字串全部載入到記憶體裡面需要乙份記憶體,t1 陣列需要四倍於它的記憶體(int 陣列,長度與串一致)。那麼,空間上可以優化嗎 ?答案是可以的,在那篇剖析 kmp 演算法的文章中實際上已經點明了它的本質: t1 陣列記錄的是每個子串前字尾匹配的長度,在計算子串 [0, n) 的這個值時,其實已經不用儲存前面 n-2 個子串的 t1 值了。所以按如下改進後的演算法優化空間複雜度。
演算法:另外一種省空間的方法去求 t1 陣列最後乙個元素
/* 設當前針對[0,x] 求得的最長前字尾相等的長度為 t,有以下規則
a). 字元區間相等關係: [0,t-1]=[x-t+1,x], [0,2t-x-2]=[x-t+1,t-1], [0,3t-2x-1]=[x-t+1,2t-x]......
b). 以上各區間 t, 2t-x-1, 3t-2x-2, .... 項數依次少 x-t+1
c). 字元相等關係: [x]=[x-(x-t+1)]=[x-2(x-t+1)]=......=[x-n(x-t+1)]
1.x=0 時 t=0
2.置 fnd=0
do--- 若 t=0, 則 t=([x]==[0]), fnd=1
--- 若 t!=0
--- 若 [t]==[x] 則 t=t+1, fnd=1
--- 若 2t>x-1 且 [2t-x-1]==[x] 則 t=2t-x-1, fnd=1
--- 若 3t>2x-2 且 [3t-2x-2]== [x] 則 t=3t-2x-2, fnd=1
--- ...
--- 若 fnd=1 則 t=([x]==[0]), fnd=1
end**見:
重複字串的判定問題(kmp 演算法)
該篇文章給出另一種解法,基於 kmp 演算法的判定。該演算法是舉例發現的,設迴圈單元長度為 l,設 len l n 則 0,l l,2 l 2 i 3 l 3 l,4 l 4 l,5 l n 1 l,n l 那麼,原串必然存在前字尾相等。因而可以聯想到 kmp 演算法的 next 陣列 在作者認知,...
字串 KMP演算法,重複的子字串
普通的方法,雙指標逐個比較 class solution begin1 begin2 if match return false kmp方法,在乙個串中查詢是否出現過另乙個串,這是kmp的看家本領。如果len len next len 1 0 則說明 陣列長度 最長相等前字尾的長度 正好可以被 陣列...
判定重複字串c語言版(基於kmp
串中任意個連續的字元組成的子串行稱為該串的子串。目標 輸入乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。說明 輸入的字串只含有小寫英文本母,並且長度不超過10000。輸出的可以是布林型別的值,也可以是 1 或 0,其中 1 表示可以由它的乙個子串重複多次 構成,0 相反,能表達出意思即可...