国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

kmp算法對應next數組中核心while部分的剖析

2019-11-08 03:24:36
字體:
來源:轉載
供稿:網友

在寫此文之前,我看了很多關于kmp算法的資料,此文主要是針對對應kmp算法已經稍微知道,但是卻看不懂求解next數組部分的while部分。

while部分是整個求解next數組的核心。相信看過kmp算法資料的人都知道,所謂的next數組,是待匹配的字符串的最大相同前后綴。

例如 主字符串“adhajdnjkabefaehdfbieadbkaeudio”  待匹配的字符串“adb”,就是從主串中去尋找是否存在待匹配的字符串。

對于一般情況,求解字符串的next數組,很容易理解,關鍵在于

while (index >= 0 && pattern[i] != pattern[index + 1])//pattern是待匹配的數組 ,index是對應位置的最大相同前后綴。

{index = next[index];}

我相信肯定有部分人對這個while里面的內容百思不得其解。

這里 我的next數組的初始值為0,有些資料上是-1.

如果字符串的某位的next值不為0(假設為n),說明此位(假設為y)與前面的第n位相同,并且從y-n到y,和從0到n都分別對應相同。

但是到了第y+1位時,忽然和第n+1位不一樣了,問題就來了,我一開始以為,既然不一樣了,那么y+1位的next值就是0咯。

其實不一定,因為在前n位仍然存在小于n位的字符串可能與第y+1位以及y+1位前幾位正好對應匹配。

那我們假設,存在這種情況,如下圖

倒數第二位的c和第7位的c相同。next值為7.可是倒數第1位的t和第8位的a不匹配。但是我們發現,它和第4位的t相同。并且,前面三位也正好匹配。

這確實是一種巧合,但是我們不能忽略這種巧合,關鍵在于怎么求。

我們知道,倒數第二位的c和第7位的c相同,那么如果第7位的c也有匹配值(不為0),例如圖上就是第三位的c,也就是說,倒數第二位的c和第三位的c一樣。

這個時候我們再判斷第三位和倒數第二位分別延后一位的字符是否一樣。圖上是一樣的,所以最后一位t匹配值為4.

當然,如果不一樣,我們就繼續while循環,第三位的c是否有匹配值(也就是倒數第二位的c是否還有更小的匹配值),如果有,那么重復上述。

也就是while的作用。直到前面都沒了匹配值,也就是為0了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江安县| 天柱县| 晴隆县| 临沭县| 贵定县| 喜德县| 枝江市| 南靖县| 水富县| 光泽县| 峡江县| 黄冈市| 灵台县| 阜新| 子长县| 达拉特旗| 山东省| 台州市| 会宁县| 许昌市| 吴江市| 江城| 蕉岭县| 梨树县| 名山县| 壶关县| 泸州市| 盘山县| 望城县| 鄯善县| 鱼台县| 阜城县| 友谊县| 衡阳市| 仙游县| 阿尔山市| 平远县| 麦盖提县| 康定县| 永嘉县| 陇西县|