KMP kmp學習(個人知識點理解順序)

2021-06-29 16:56:21 字數 1909 閱讀 8610

學習kmp知識點順序

1、字串字首和字尾的概念

如果給定的模式串是:「abcdabd」,從左至右遍歷整個模式串,其各個子串的字首字尾分別如下**所示:

也就是說,原模式串子串對應的各個字首字尾的公共元素的最大長度表為(下簡稱《

最大長度表

2、kmp演算法

3、next陣列的理解就是找最大對稱長度的字首字尾,然後整體右移一位,初值賦為-1(當然,你也可以直接

計算某個字元對應的next值,就是看這個字元之前的字串中有多大長度的相同字首字尾)。

換言之,對於給定的模式串:abcdabd,它的最大長度表及next 陣列分別如下:

根據最大長度表求出了next 陣列後,從而有

失配時,模式串向右移動的位數為:失配字元所在位置 - 失配字元對應的next 值

而後,你會發現,無論是基於《最大長度表》的匹配,還是基於next 陣列的匹配,兩者得出來的向右移動的位數是一樣的。為什麼呢?因為:

所以,你可以把《最大長度表》看做是next 陣列的雛形,甚至就把它當做next 陣列也是可以的,區別不過是怎麼用的問題。

4、通過遞迴計算next陣列

5、next陣列的優化

如果用之前的next 陣列方法求模式串「abab」的next 陣列,可得其next 陣列為-1 0 0 1(0 0 1 2整體右移一位,初值賦為-1),當它跟下圖中的文字串去匹配的時候,發現b跟c失配,於是模式串右移j - next[j] = 3 - 1 =2位。

右移2位後,b又跟c失配。事實上,因為在上一步的匹配中,已經得知p[3] = b,與s[3] = c失配,而右移兩位之後,讓p[ next[3] ] = p[1] = b 再跟s[3]匹配時,必然失配。問題出在哪呢?

問題出在不該出現p[j] = p[ next[j] ]。為什麼呢?理由是:當p[j] != s[i] 時,下次匹配必然是p[ next [j]] 跟s[i]匹配,如果p[j] = p[ next[j] ],必然導致後一步匹配失敗(因為p[j]已經跟s[i]失配,然後你還用跟p[j]等同的值p[next[j]]去跟s[i]匹配,很顯然,必然失配),所以不能允許p[j] = p[ next[j ]]。如果出現了p[j] = p[ next[j] ]咋辦呢?如果出現了,則需要再次遞迴,即令next[j] = next[ next[j] ]。

所以,咱們得修改下求next 陣列的**。

//優化過後的next 陣列求法  

void getnextval(char* p, int next)

else

} }

個人知識點總結

解除安裝 1.解除安裝 viewholder.iv antivirusitem clear.setonclicklistener new onclicklistener 2.監聽解除安裝廣播事件 1.建立監聽解除安裝的廣播接受者 private class uninstallreceiver ext...

個人知識點總結

1.url headers 引數確定 url 如果目標 是靜態的網頁,那就直接確定是他 遇到 ajax 非同步載入 需要通過 network 中 xhr 來通過抓包獲取資料 headers 這個不多說了 2.關於請求方式 我用的最多的 還是 get 請求 還有乙個沒有怎麼學到post 就pass 常...

python知識點理解

1 賦值 淺拷貝和深拷貝 對於非容器型別 組合型別 如數字 字元,以及其他的 原子 型別,沒有拷貝一說,產生的都是原物件的引用。深拷貝 建立新的物件,遞迴的拷貝原物件所包含的子物件。深拷貝出來的物件與原物件沒有任何關聯。三者的具體區別看下面的例子 import copy if name main a...