簡體   English   中英

KMP的LPS計算時間復雜度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM