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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

转自知乎-我见过最通俗易懂的KMP算法详解

發(fā)布時(shí)間:2025/3/11 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转自知乎-我见过最通俗易懂的KMP算法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有些算法,適合從它產(chǎn)生的動(dòng)機(jī),如何設(shè)計(jì)與解決問(wèn)題這樣正向地去介紹。但KMP算法真的不適合這樣去學(xué)。最好的辦法是先搞清楚它所用的數(shù)據(jù)結(jié)構(gòu)是什么,再搞清楚怎么用,最后為什么的問(wèn)題就會(huì)有恍然大悟的感覺(jué)。我試著從這個(gè)思路再介紹一下。大家只需要記住一點(diǎn),PMT是什么東西。然后自己臨時(shí)推這個(gè)算法也是能推出來(lái)的,完全不需要死記硬背。KMP算法的核心,是一個(gè)被稱(chēng)為部分匹配表(Partial Match Table)的數(shù)組。我覺(jué)得理解KMP的最大障礙就是很多人在看了很多關(guān)于KMP的文章之后,仍然搞不懂PMT中的值代表了什么意思。這里我們拋開(kāi)所有的枝枝蔓蔓,先來(lái)解釋一下這個(gè)數(shù)據(jù)到底是什么。對(duì)于字符串“abababca”,它的PMT如下表所示:

就像例子中所示的,如果待匹配的模式字符串有8個(gè)字符,那么PMT就會(huì)有8個(gè)值。

我先解釋一下字符串的前綴和后綴。如果字符串A和B,存在A=BS,其中S是任意的非空字符串,那就稱(chēng)B為A的前綴。例如,”Harry”的前綴包括{”H”, ”Ha”, ”Har”, ”Harr”},我們把所有前綴組成的集合,稱(chēng)為字符串的前綴集合。同樣可以定義后綴A=SB, 其中S是任意的非空字符串,那就稱(chēng)B為A的后綴,例如,”P(pán)otter”的后綴包括{”otter”, ”tter”, ”ter”, ”er”, ”r”},然后把所有后綴組成的集合,稱(chēng)為字符串的后綴集合。要注意的是,字符串本身并不是自己的后綴。

有了這個(gè)定義,就可以說(shuō)明PMT中的值的意義了。PMT中的值是字符串的前綴集合與后綴集合的交集中最長(zhǎng)元素的長(zhǎng)度。例如,對(duì)于”aba”,它的前綴集合為{”a”, ”ab”},后綴 集合為{”ba”, ”a”}。兩個(gè)集合的交集為{”a”},那么長(zhǎng)度最長(zhǎng)的元素就是字符串”a”了,長(zhǎng) 度為1,所以對(duì)于”aba”而言,它在PMT表中對(duì)應(yīng)的值就是1。再比如,對(duì)于字符串”ababa”,它的前綴集合為{”a”, ”ab”, ”aba”, ”abab”},它的后綴集合為{”baba”, ”aba”, ”ba”, ”a”}, 兩個(gè)集合的交集為{”a”, ”aba”},其中最長(zhǎng)的元素為”aba”,長(zhǎng)度為3。

好了,解釋清楚這個(gè)表是什么之后,我們?cè)賮?lái)看如何使用這個(gè)表來(lái)加速字符串的查找,以及這樣用的道理是什么。如圖 1.12 所示,要在主字符串"ababababca"中查找模式字符串"abababca"。如果在 j 處字符不匹配,那么由于前邊所說(shuō)的模式字符串 PMT 的性質(zhì),主字符串中 i 指針之前的 PMT[j ?1] 位就一定與模式字符串的第 0 位至第 PMT[j?1] 位是相同的。這是因?yàn)橹髯址?i 位失配,也就意味著主字符串從 i?j 到 i 這一段是與模式字符串的 0 到 j 這一段是完全相同的。而我們上面也解釋了,模式字符串從 0 到 j?1 ,在這個(gè)例子中就是”ababab”,其前綴集合與后綴集合的交集的最長(zhǎng)元素為”abab”, 長(zhǎng)度為4。所以就可以斷言,主字符串中i指針之前的 4 位一定與模式字符串的第0位至第 4 位是相同的,即長(zhǎng)度為 4 的后綴與前綴相同。這樣一來(lái),我們就可以將這些字符段的比較省略掉。具體的做法是,保持i指針不動(dòng),然后將j指針指向模式字符串的PMT[j ?1]位即可。

簡(jiǎn)言之,以圖中的例子來(lái)說(shuō),在 i 處失配,那么主字符串和模式字符串的前邊6位就是相同的。又因?yàn)槟J阶址那?位,它的前4位前綴和后4位后綴是相同的,所以我們推知主字符串i之前的4位和模式字符串開(kāi)頭的4位是相同的。就是圖中的灰色部分。那這部分就不用再比較了。

有了上面的思路,我們就可以使用PMT加速字符串的查找了。我們看到如果是在 j 位 失配,那么影響 j 指針回溯的位置的其實(shí)是第 j ?1 位的 PMT 值,所以為了編程的方便, 我們不直接使用PMT數(shù)組,而是將PMT數(shù)組向后偏移一位。我們把新得到的這個(gè)數(shù)組稱(chēng)為next數(shù)組。下面給出根據(jù)next數(shù)組進(jìn)行字符串匹配加速的字符串匹配程序。其中要注意的一個(gè)技巧是,在把PMT進(jìn)行向右偏移時(shí),第0位的值,我們將其設(shè)成了-1,這只是為了編程的方便,并沒(méi)有其他的意義。在本節(jié)的例子中,next數(shù)組如下表所示。

  • int KMP(char * t, char * p)
  • {
  • int i = 0;
  • int j = 0;
  • while (i < strlen(t) && j < strlen(p))
  • {
  • if (j == -1 || t[i] == p[j])
  • {
  • i++;
  • j++;
  • }
  • else
  • j = next[j];
  • }
  • if (j == strlen(p))
  • return i - j;
  • else
  • return -1;
  • }
  • 好了,講到這里,其實(shí)KMP算法的主體就已經(jīng)講解完了。你會(huì)發(fā)現(xiàn),其實(shí)KMP算法的動(dòng)機(jī)是很簡(jiǎn)單的,解決的方案也很簡(jiǎn)單。遠(yuǎn)沒(méi)有很多教材和算法書(shū)里所講的那么亂七八糟,只要搞明白了PMT的意義,其實(shí)整個(gè)算法都迎刃而解。

    現(xiàn)在,我們?cè)倏匆幌氯绾尉幊炭焖偾蟮胣ext數(shù)組。其實(shí),求next數(shù)組的過(guò)程完全可以看成字符串匹配的過(guò)程,即以模式字符串為主字符串,以模式字符串的前綴為目標(biāo)字符串,一旦字符串匹配成功,那么當(dāng)前的next值就是匹配成功的字符串的長(zhǎng)度。

    具體來(lái)說(shuō),就是從模式字符串的第一位(注意,不包括第0位)開(kāi)始對(duì)自身進(jìn)行匹配運(yùn)算。 在任一位置,能匹配的最長(zhǎng)長(zhǎng)度就是當(dāng)前位置的next值。如下圖所示。






    求next數(shù)組值的程序如下所示:

  • void getNext(char * p, int * next)
  • {
  • next[0] = -1;
  • int i = 0, j = -1;
  • while (i < strlen(p))
  • {
  • if (j == -1 || p[i] == p[j])
  • {
  • ++i;
  • ++j;
  • next[i] = j;
  • }
  • else
  • j = next[j];
  • }
  • }
  • 作者:海納
    鏈接:https://www.zhihu.com/question/21923021/answer/281346746
    來(lái)源:知乎
    著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。


    總結(jié)

    以上是生活随笔為你收集整理的转自知乎-我见过最通俗易懂的KMP算法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    主站蜘蛛池模板: 在线观看免费小视频 | 五月丁香综合激情六月久久 | 日本免费黄色 | 光明影院手机版在线观看免费 | 日韩国产在线一区 | 夜夜操综合| 99国产精品久久久 | 国产18页 | 免费看av在线 | 天天综合一区 | 女同爱爱视频 | 国产精品久久久久久久久久久新郎 | 免费啪| 丰满人妻综合一区二区三区 | 色狠久 | 欧美精品乱码 | 91精品国产欧美一区二区成人 | 一级黄色大全 | 国产精品美女毛片真酒店 | 黄色在线观看免费视频 | 精品人妻久久久久久888不卡 | 少妇福利视频 | 最新av在线网站 | 91看视频| 黄毛片在线观看 | 国产美女91呻吟求 | www.99热| 日本免费网 | 精品久久久久久久久久久久 | 色偷偷视频| 日韩乱码人妻无码中文字幕 | 超碰成人97 | 99资源站| 美女黄视频大全 | 国产精品自拍一区 | 成人免费在线视频网站 | 99久久精品免费视频 | 五月婷婷激情五月 | 神马影院一区二区三区 | 日韩欧美国产片 | 在线观看欧美一区二区三区 | 青青自拍视频 | 中文字幕一区二区三区又粗 | 99资源站| 欧美性生活一级 | 天堂视频免费 | 日皮视频在线观看 | 欧美毛片视频 | 国产第8页 | 男女曰逼视频 | 欧美成人精品欧美一级乱 | 成人片黄网站色大片免费毛片 | va在线观看 | 国产在线伊人 | 看黄网站在线观看 | 1024亚洲| 对白超刺激精彩粗话av | 国精品人妻无码一区二区三区喝尿 | 婷婷综合精品 | 熟妇人妻精品一区二区三区视频 | 国产一区二区视频免费观看 | 九九视频在线观看 | 天天看夜夜爽 | 日本伦理在线 | 精品视频一区在线观看 | 波多野结衣亚洲天堂 | 变态另类ts人妖一区二区 | 久久久久久久久久成人 | 国产美女作爱视频 | 欧美日韩久久精品 | 99午夜| 国产乱人 | 福利一区在线观看 | 一道本无吗一区 | 伊人爱爱网 | 黄色在线视频播放 | 寂寞少妇让水电工爽hd | 精品综合网| 亚洲精品久久久久久动漫器材一区 | 青青伊人国产 | 九九热播视频 | 国产农村妇女aaaaa视频 | 少妇高潮大叫好爽喷水 | 7777奇米影视 | 99热18| 国产精品欧美久久久久久 | 91久久中文字幕 | 亚洲精品国产一区二区 | 熟女毛片 | 天天射天天干天天操 | 久久久久xxxx | 亚洲天堂精品在线 | www毛片| 国产福利片一区二区 | 亚洲av男人的天堂在线观看 | 麻豆app在线观看 | 亚洲精品国产精品乱码不99热 | 中国国产黄色片 | 久久精品成人一区二区三区蜜臀 |