日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

KMP算法的Next数组详解(转)

發(fā)布時間:2025/3/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KMP算法的Next数组详解(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

轉(zhuǎn)載請注明來源,并包含相關鏈接。

?

網(wǎng)上有很多講解KMP算法的博客,我就不浪費時間再寫一份了。直接推薦一個當初我入門時看的博客吧: http://www.cnblogs.com/yjiyjige/p/3263858.html 這位同學用詳細的圖文模式講解了KMP算法,非常適合入門。 ----------------------------------------------------------------------------------------------

KMP的next數(shù)組求法是很不容易搞清楚的一部分,也是最重要的一部分。我這篇文章就以我自己的感悟來慢慢推導一下吧!保證你看完過后是知其然,也知其所以然。

如果你還不知道KMP是什么,請先閱讀上面的鏈接,先搞懂KMP是要干什么。 下面我們就來說說KMP的next數(shù)組求法。 KMP的next數(shù)組簡單來說,假設有兩個字符串,一個是待匹配的字符串strText,一個是要查找的關鍵字strKey。現(xiàn)在我們要在strText中去查找是否包含strKey,用i來表示strText遍歷到了哪個字符,用j來表示strKey匹配到了哪個字符。 如果是暴力的查找方法,當strText[i]和strKey[j]匹配失敗的時候,i和j都要回退,然后從i-j的下一個字符開始重新匹配。 而KMP就是保證i永遠不回退,只回退j來使得匹配效率有所提升。它用的方法就是利用strKey在失配的j為之前的成功匹配的子串的特征來尋找j應該回退的位置。而這個子串的特征就是前后綴的相同程度。 所以next數(shù)組其實就是查找strKey中每一位前面的子串的前后綴有多少位匹配,從而決定j失配時應該回退到哪個位置。

我知道上面那段廢話很難懂,下面我們看一個彩圖:

這個圖畫的就是strKey這個要查找的關鍵字字符串。假設我們有一個空的next數(shù)組,我們的工作就是要在這個next數(shù)組中填值。 下面我們用數(shù)學歸納法來解決這個填值的問題。 這里我們借鑒數(shù)學歸納法的三個步驟(或者說是動態(tài)規(guī)劃?): 1、初始狀態(tài) 2、假設第j位以及第j位之前的我們都填完了 3、推論第j+1位該怎么填

初始狀態(tài)我們稍后再說,我們這里直接假設第j位以及第j位之前的我們都填完了。也就是說,從上圖來看,我們有如下已知條件: next[j] == k; next[k] == 綠色色塊所在的索引; next[綠色色塊所在的索引] == 黃色色塊所在的索引; 這里要做一個說明:圖上的色塊大小是一樣的(沒騙我?好吧,請忽略色塊大小,色塊只是代表數(shù)組中的一位)。

我們來看下面一個圖,可以得到更多的信息:

1.由"next[j] == k;"這個條件,我們可以得到A1子串 == A2子串(根據(jù)next數(shù)組的定義,前后綴那個)。

2.由"next[k] == 綠色色塊所在的索引;"這個條件,我們可以得到B1子串 == B2子串。

3.由"next[綠色色塊所在的索引] == 黃色色塊所在的索引;"這個條件,我們可以得到C1子串 == C2子串。

4.由1和2(A1 == A2,B1 == B2)可以得到B1 == B2 == B3。

5.由2和3(B1 == B2, C1 == C2)可以得到C1 == C2 == C3。

6.B2 == B3可以得到C3 == C4 == C1 == C2

上面這個就是很簡單的幾何數(shù)學,仔細看看都能看懂的。我這里用相同顏色的線段表示完全相同的子數(shù)組,方便觀察。

?

接下來,我們開始用上面得到的條件來推導如果第j+1位失配時,我們應該填寫next[j+1]為多少?

next[j+1]即是找strKey從0到j這個子串的最大前后綴:

#:(#:在這里是個標記,后面會用)我們已知A1 == A2,那么A1和A2分別往后增加一個字符后是否還相等呢?我們得分情況討論:

(1)如果str[k] == str[j],很明顯,我們的next[j+1]就直接等于k+1。

  用代碼來寫就是next[++j] = ++k;

(2)如果str[k] != str[j],那么我們只能從已知的,除了A1,A2之外,最長的B1,B3這個前后綴來做文章了。

那么B1和B3分別往后增加一個字符后是否還相等呢?

由于next[k] == 綠色色塊所在的索引,我們先讓k = next[k],把k挪到綠色色塊的位置,這樣我們就可以遞歸調(diào)用"#:"標記處的邏輯了。

?

由于j+1位之前的next數(shù)組我們都是假設已經(jīng)求出來了的,因此,上面這個遞歸總會結(jié)束,從而得到next[j+1]的值。

?

我們唯一欠缺的就是初始條件了:

next[0] = -1,? k = -1, j = 0

另外有個特殊情況是k為-1時,不能繼續(xù)遞歸了,此時next[j+1]應該等于0,即把j回退到首位。

即 next[j+1] = 0; 也可以寫成next[++j] = ++k;

?

public static int[] getNext(String ps) {char[] strKey = ps.toCharArray(); int[] next = new int[strKey.length]; // 初始條件 int j = 0; int k = -1; next[0] = -1; // 根據(jù)已知的前j位推測第j+1位 while (j < strKey.length - 1) { if (k == -1 || strKey[j] == strKey[k]) { next[++j] = ++k; } else { k = next[k]; } } return next; }

?

現(xiàn)在再看這段代碼應該沒有任何問題了吧。

優(yōu)化:

細心的朋友應該發(fā)現(xiàn)了,上面有這樣一句話:

(1)如果str[k] == str[j],很明顯,我們的next[j+1]就直接等于k+1。用代碼來寫就是next[++j] = ++k;

可是我們知道,第j+1位是失配了的,如果我們回退j后,發(fā)現(xiàn)新的j(也就是此時的++k那位)跟回退之前的j也相等的話,必然也是失配。所以還得繼續(xù)往前回退。

public static int[] getNext(String ps) {char[] strKey = ps.toCharArray(); int[] next = new int[strKey.length]; // 初始條件 int j = 0; int k = -1; next[0] = -1; // 根據(jù)已知的前j位推測第j+1位 while (j < strKey.length - 1) { if (k == -1 || strKey[j] == strKey[k]) { // 如果str[j + 1] == str[k + 1],回退后仍然失配,所以要繼續(xù)回退 if (str[j + 1] == str[k + 1]) { next[++j] = next[++k]; } else { next[++j] = ++k; } } else { k = next[k]; } } return next; }

好了,自此KMP的next求法全部講解完畢。歡迎大家指出文章的錯誤,我好更加完善它。

----------------------------------------------------------------------------------------------------------

下面說說面試的時候,給一個字符串,要你寫出它的Next數(shù)組,應該怎么寫:

①:先對每一位左邊的子串求出最大前后綴串的長度,作為初始的Next數(shù)組

②:因為第一位失配時需要移動i,因此賦值為-1

③:P[3] == A, Next[3] == 0, P[0] == A;? 所以P[3] == P[0], (移動過去后還是失配,需要繼續(xù)移動),優(yōu)化Next[3]為Next[0],即-1

④:同理優(yōu)化Next[10]為Next[0],即-1

⑤:同理優(yōu)化P[14],P[15],P[16]

http://www.cnblogs.com/tangzhengyue/p/4315393.html

?

總結(jié)

以上是生活随笔為你收集整理的KMP算法的Next数组详解(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 特级新鲜大片片 | 亚洲欧美一区二区精品久久久 | 一区视频免费观看 | 麻豆精品国产传媒mv男同 | 国模小丫大尺度啪啪人体 | 国产黄片一区二区三区 | 欧美激情18 | 亚洲天堂免费 | 一区二区成人免费视频 | 老女人毛片50一60岁 | 能看的黄色网址 | 国产精品99无码一区二区 | 亚洲无线视频 | 激情视频在线观看免费 | 五月中文字幕 | 伊人网亚洲 | 极品少妇xxxx精品少妇 | 国产精品日韩电影 | 最近免费中文字幕 | 91久久超碰 | 日本二区视频 | 亚洲蜜桃av一区二区 | 轻轻色在线观看 | 亚洲日本一区二区 | 97超碰人人模人人人爽人人爱 | 三上悠亚中文字幕在线播放 | 黄色成人在线观看 | 香蕉视频黄色 | 毛片在线网站 | 特级av片 | 亚洲永久免费视频 | 五月天婷婷色 | 欧美视频一区二区三区四区在线观看 | 亚洲永久免费观看 | 天堂成人国产精品一区 | 99视频一区二区 | 日韩黄页网站 | 香蕉91视频 | 视频在线 | 性工作者十日谈 | 亚拍一区| www.日本黄色| 热久久精品 | 亚洲做受高潮 | 少妇把腿扒开让我舔18 | 色哟哟日韩精品 | 午夜肉体高潮免费毛片 | 欧美黑人做爰爽爽爽 | www.色哟哟 | 狠狠狠狠狠狠狠干 | 黄色网址av | 欧美日韩一区二区三区在线视频 | 免费看黄色的视频 | 国产精品vip | 欧美专区日韩专区 | 国产欧美123| 国产又黄又嫩又滑又白 | 亚洲欧美日韩激情 | 强迫凌虐淫辱の牝奴在线观看 | 一级视频在线播放 | 色免费看| 欧美精品在线观看一区二区 | 中文字幕日本视频 | 亚洲欧美日韩一区二区 | 亚洲色欲色欲www | 中文精品久久久久人妻不卡 | 日本三级韩国三级三级a级按摩 | 一区二区三区视频免费看 | 丁香六月av| 一级毛片黄色 | 精品国产午夜 | 在线视频久久 | 亚洲一区二区三区激情 | 在线a级| 亚洲乱码一区二区 | 51福利视频 | 亚洲国产小视频 | 一级片黑人 | 亚洲精品乱码久久久久久写真 | 91 在线视频 | 漂亮人妻洗澡被公强 日日躁 | 黄色不雅视频 | 欧美爱爱网站 | 91网址在线 | 裸体喂奶一级裸片 | 美女三级黄色片 | 久久国产成人 | 北条麻妃一区二区三区四区五区 | 国产精品无码av在线播放 | 精品福利在线视频 | 超碰在线网站 | av高清在线观看 | 香蕉精品视频在线观看 | 爱爱视频天天干 | 少妇人妻好深好紧精品无码 | 男人日女人免费视频 | 涩视频在线观看 | 国产一区二区三区在线视频 | 中日韩黄色大片 |