簡體   English   中英

KMP算法的最佳和最差時間復雜度是多少

[英]What is the best & worst time complexity Of KMP algorithm

需要澄清 KMP 算法的最佳時間復雜度和最壞時間復雜度。 令我困惑的是 O(n) 的最差搜索時間復雜度。 我在網上閱讀后了解到,有兩個索引。 一個索引 i 用於文本,另一個索引 j 用於模式。 我們不減少文本索引 i。 但是當存在不匹配且 j 值大於 0 時,我們會遞減模式索引 j。在這種情況下,i 保持不變。 那么最壞的時間復雜度怎么會是O(n)呢? 它應該比 O(mn) 還多。 對於特定的 i 值,我們可以對 j 進行多次迭代。

最好的情況是什么? 它與最壞的情況有什么不同嗎? 我正在尋找簡單的解釋,因為我已經閱讀了不同的教程。

KMP 不會在不增加 i 的情況下增加 j。 因此,即使在 i 的每次增量之間可以有 j 的 Theta(m) 減量,在算法過程中 j 的減量總數不能超過 j 的增量總數,它等於增量數我的所有都是 Theta(n),KMP 的最壞和最好情況漸近運行時間(假設我們找到了所有匹配項;如果不是,那么顯然最好的情況是 Theta(m))。

大衛的回答是正確的。 您需要先匹配 j。 然后 j 值將增加並變得大於零。 之后,您可以遞減 j 值。 當你增加 j 時,你也在增加 i。 因此,如果您將 j 索引減少 n 次,則意味着您已經至少將 j 索引增加了 n 次 & 這反過來意味着您已經將 i 索引增加了 n 次。 這樣你就完成了對文本的遍歷。

所以時間復雜度是 n 個負步 + n 個正步 = 2n 步。 這就是 O(n)。

您可以查看此鏈接http://www.w3spot.com/2020/07/kmp-algorithm-explained-in-plain-english.html它通過幾個示例逐步解釋它,一個具有重復模式和一個與非重復模式。 而且很容易理解。

假設我們在字符串 s 中搜索字符串 p,每個字符串的長度是 m 和 n。

最好的例子,顯然是 O(m)

在此處輸入圖片說明

但是如果 p 不在 s 中,最好的情況應該是,一旦不匹配,p 會盡可能右移,搜索階段的成本為 O(n + n/m)。

在此處輸入圖片說明

最壞的例子是,一旦不匹配,p 就會非常保守地右移,搜索階段的成本為 O(n + (m-1) * (n/m))。

在此處輸入圖片說明

其中 n/m 是有多少不匹配。

而且,加上預處理階段,在最好和最壞的情況下,總時間成本仍然是 O(m+n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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