在韓順平災難性的講解下我並沒有搞懂什麼叫kmp演算法,在他的推薦下我去看了看部落格的內容,確實是有所幫助,將韓順平沒有講清楚的next陣列遞迴過程點出來了。但是對於我最最關心的next陣列如何生生成的細節則說的還是有一些不太清楚。文中雖然舉了兩個例子,但是這兩個例子尤其是第二個例子試圖說明「能在字首中找到字元的例子」時舉例還是有一些極端,我在下文補充乙個例子。
以下的內容就接著部落格的內容去進行敘述。
對於字串的字首和字尾我畫了上面的圖來闡述:
首先,最長的兩條綠色線段表示正在成功匹配的字首和字尾,模擬到下面的字串,就是紅線加粗強調的部分。但是繼續匹配時,發現f和e無法完成匹配了(正如下面的圖),上面圖的體現方式是出現了一小段紅色的不和諧,我拿紫色的圈圈圈住了這段不和諧。這種情況下,當正在匹配成功的字首和字尾無法繼續匹配成功了。這時候我們需要做什麼呢?
這時候就涉及到kmp演算法最讓人難以理解的部分,即:
k = next[k]
其中該部落格原文是這麼描述的:
那為何遞迴字首索引k = next[k],就能找到長度更短的相同字首字尾呢?這又歸根到next陣列的含義。我們拿字首 p0 pk-1 pk 去跟字尾pj-k pj-1 pj匹配,如果pk 跟pj 失配,下一步就是用p[next[k]] 去跟pj 繼續匹配,如果p[ next[k] ]跟pj還是不匹配,則需要尋找長度更短的相同字首字尾,即下一步用p[ next[ next[k] ] ]去跟pj匹配。此過程相當於模式串的自我匹配,所以不斷的遞迴k = next[k],直到要麼找到長度更短的相同字首字尾,要麼沒有長度更短的相同字首字尾。如下圖所示...應該說,這個遞迴過程博主說得很準確。當我們令k = next[k],k代表的字元立即會由f變為e(即下面圖序號2旁邊的f變為我拿紅圈圈圈住的左邊的e)。這時我們會發現乙個很神奇的事情,即序號1,2,3指出的abcd字串都是相同的,因為序號2等於序號3,序號1等於序號2,可以推知序號1等於序號3(這個等式對應的穩態很重要,因為這個等式指明了為什麼不會存在更長相同字首字尾的原因,因為如果存在更長的,這個等式也成立,則通過k = next[k]同樣會找到這個更長的)。這時,如果兩個圈住的e是相等的,則一定可以確定我們可以得到乙個更小的匹配abcde。如果這時候兩個圈住的e是不相等的,我們則需要進行進一步的遞迴,對應到圖一,即對序號4指代的藍線進行進一步的遞迴,重複上述操作。
韓順平給出的**是這樣的:
//獲取到乙個字串(字串)的部分匹配值
public static int kmpnext(string dest)
//當dest.charat(i) == dest.charat(j),部分匹配值就加一
if (dest.charat(i) == dest.charat(j))
next[i] = j;
}return next;
}
韓順平 玩轉oracle 角色
connect角色 具有一般應用開發人員需要的大部分許可權 具有的系統許可權 alter session create cluster create database link create session create table create view create sequence resou...
尚矽谷之JDBC
可以通過 drivermanager 類建立到資料庫的連線connection drivermanager 試圖從已註冊的 jdbc 驅動程式集中選擇乙個適當的驅動程式。public static connection getconnection string url public static c...
尚矽谷hbaseshell練習
3.1 基本操作 1 進入hbase客戶端命令列 atguigu hadoop102 hbase bin hbase shell 2 檢視幫助命令 hbase main 001 0 help 3 檢視當前資料庫中有哪些表 hbase main 002 0 list 3.2 表的操作 1 建立表 hb...