KMP演算法的時間複雜度與next陣列分析

2022-09-14 06:06:10 字數 1485 閱讀 7964

kmp 演算法是一種改進的字串匹配演算法,用於判斷乙個字串是否是另乙個字串的子串

o(m+n)

kmp演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是通過乙個 next() 實現

長度與字串長度一致,每個位置儲存對應字元的最長匹配長度

例如 abcdabd,得到的 next 陣列為 [0,0,0,0,1,2,0]

簡單地觀察一下就會發現,該演算法會進行最少 21 次的字串判斷,這還是在不考慮字串匹配的時間消耗,光此一項的時間複雜度就是

o(n) = (n(n - 1)) /2 = n² / 2 + n / 2 = n²

在加上匹配字串,就是m + n²顯然大於kmp演算法的時間複雜度m + n

function

get_next(s)

else

}return

next;

}

例如:

j=0,    i=1,    (j=0),     next=[0,1];

j=1, i=2, (a!=b), j=next[0];

j=0, i=2, (j=0), next=[0,1,1];

j=1, i=3, (a!=c), j=next[0];

j=0, i=3, (j=0), next=[0,1,1,1];

j=1, i=4, (a!=d), j=next[0];

j=0, i=4, (j=0), next=[0,1,1,1,1];

j=1, i=5, (a=a), next=[0,1,1,1,1,2];

j=2, i=6, (b=b), next=[0,1,1,1,1,2,3];

總共執行9次就獲得了next陣列,演算法時間複雜度是o(n) = n

//

1.阮//

i值即移動位數:移動位數 = 已匹配的字元數 - 對應的部分匹配值

function

kmp(s1, s2)

else

if (j == s2.length - 1) }}

return -1;}

//2.程

function

kmp2(s1, s2)

else

if (j == s2.length - 1)

i++;}}

return -1;}

//3.也正是由於i值的大小隨著j值的大小進行改變,

//使得被查詢字串僅被遍歷一次即可得到解。

//故時間複雜度為m

//加上獲得next陣列的時間複雜度就是kmp演算法的總時間複雜度m+n;

演算法的複雜度 時間複雜度與空間複雜度

通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...

演算法的時間複雜度與空間複雜度

雖然計算機能快速的完成運算處理,但實際上,它也需要根據輸入資料的大小和演算法效率來消耗一定的處理器資源。要想編寫出能高效執行的程式,我們就需要考慮到演算法的效率。演算法的效率主要由以下兩個複雜度來評估 時間複雜度 評估執行程式所需的時間。可以估算出程式對處理器的使用程度。空間複雜度 評估執行程式所需...

演算法的 時間複雜度 與 空間複雜度

如果乙個演算法的執行次數是 t n 那麼只保留最高次項,同時忽略最高項的係數後得到函式 f n 此時演算法的時間複雜度就是 o f n 為了方便描述,下文稱此為 大o推導法。由此可見,由執行次數 t n 得到時間複雜度並不困難,很多時候困難的是從演算法通過分析和數 算得到 t n 對此,提供下列四個...