[英]Time complexity of LPS calculation of KMP
雖然到處都提到我們在計算 KMP 的 LPS 時只回溯內循環中增加的數量,但不清楚為什么整體復雜度為 O(length(pat))。
KMP 維護兩個索引:
k - 因為您有匹配的模式 i - 當前匹配的 Text 中的最新符號。
第一部分非常簡單,您只需將符號與您的文本進行比較,如果它可以增加 i
如果他們不這樣做,我們使用預先計算的前綴 function 來縮短當前匹配的模式,並嘗試在較短的版本上再次匹配相同的 x。 以此類推,直到我們有一個匹配和++i,或者直到k達到i並且我們有一個全新的開始。
最壞的情況是,您將擁有 k 和 i go 完全通過 Text 提供 2 * len(T) 步驟。
所以復雜度一直是 O(T + P)。 在實際查找匹配項時,我們不依賴前綴的長度。 這意味着,如果您使用一種模式的多個匹配項進行 KMP,您仍然會得到 O(T + P)
看來我想通了。 代碼如下所示:
while (j < len1) {
if (needle[i] == needle[j]) {
tab[j] = i+1;
j++;
i++;
}
else {
if (i == 0) {
tab[j] = 0;
j++;
}
else
i = tab[i-1];
}
}
所以基本上我們從不遞減 j,在某些迭代中(else->else)我們不遞增 j,並且 i 向后移動直到我們達到 0。這種向后移動可以只要 j 移動。 因此,如果 j 移動了 n 步,我們不能在最多 n 次迭代中增加 j。 這使得總迭代次數為 n+n=2n 因此復雜度為 O(n)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.