演算法 Kmp演算法初見

2021-08-13 17:00:44 字數 826 閱讀 7755

上面的說法有些官方了,其實用最最簡單的話來說就是,給計算機乙個最快的方法從乙個名單中找到你的名字,這個時候我們用這個演算法就再合適不過了。

我們一般如果要是寫乙個文字匹配的演算法的話,最最簡單的就是用迴圈去匹配了,這個應該是個只要學過程式設計的同志都應該了解的方法,如果想要在一堆字母中找到abc的話,那麼我們就需要用for去遍歷詳情字元,然後和這三個字母去匹配,但是這樣做會有乙個問題,就是,如果碰到了abd和abc相匹配的話,那麼我們下一步匹配就是bdx和abc進行匹配了,匹配過了的字元會重新再比較一遍,很是浪費時間和空間。

kpm的演算法是什麼呢?他可以返回不匹配字元的位置,從而我們可以從不匹配的下乙個位置接著進行比較,從而可以減少沒有作用的匹配,舉個例子,有abc和abdabc去匹配,那麼當第一次匹配失敗的時候,也就是abc和abd匹配的時候,這個時候返回了d的位置,那麼下次進行演算法的時候就是用abc和abc去匹配了,而不是用bda去和abc匹配了。

說道演算法不得不說的就是時間複雜度和空間複雜度,先從時間複雜度來看:

一般匹配字串時,我們從目標字串str(假設長度為n)的第乙個下標選取和ptr長度(長度為m)一樣的子字串進行比較,如果一樣,就返回開始處的下標值,不一樣,選取str下乙個下標,同樣選取長度為n的字串進行比較,直到str的末尾(實際比較時,下標移動到n-m)。這樣的時間複雜度是o(n*m)。

kmp演算法:可以實現複雜度為o(m+n)

所以kmp演算法在時間複雜度上遠遠比一般的無腦匹配要強太多,並且是需要匹配的字元數越多,它的優勢就越是明顯。

至於空間複雜度嘛,因為都是在比較,只是記錄了乙個值的問題,所以基本上在空間複雜度上kmp演算法是沒有什麼太大優勢的。詳情的情況等博主研究好了就會更新上來。

演算法 KMP演算法

kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...

演算法 kmp匹配演算法

執行結果 心得收穫 完整 計算next陣列 next陣列的目標是求得從開始到當前位置的字串相同最大前字尾長度為多少 該值的作用是在當前位置的字元匹配失敗時,匹配字串應該從那裡開始繼續匹配,而不用回到開頭 時間複雜的 o m void calnextarray const string str,int...

演算法 KMP演算法 解釋

1.詳解kmp演算法 2.大話資料結構 3,kmp演算法易懂版 kmp演算法由d.e.knuth j.h.morris和v.r.pratt發表的模式匹配演算法。kmp演算法要解決的問題就是在字串 也叫主串 中的模式 pattern 定位問題。例子 輸入 主串 s abeabx 子串 t abx 輸出...