亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

字符串匹配是計(jì)算機(jī)的基本任務(wù)之一。

舉例來(lái)說(shuō),有一個(gè)字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一個(gè)字符串"ABCDABD"?

許多算法可以完成這個(gè)任務(wù),(簡(jiǎn)稱KMP)是最常用的之一。它以三個(gè)發(fā)明者命名,起頭的那個(gè)K就是著名科學(xué)家Donald Knuth。

這種算法不太容易理解,網(wǎng)上有很多,但讀起來(lái)都很費(fèi)勁。直到讀到的文章,我才真正理解這種算法。下面,我用自己的語(yǔ)言,試圖寫一篇比較好懂的KMP算法解釋。

1.

首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一個(gè)字符與搜索詞"ABCDABD"的第一個(gè)字符,進(jìn)行比較。因?yàn)锽與A不匹配,所以搜索詞后移一位。

2.

因?yàn)锽與A不匹配,搜索詞再往后移。

3.

就這樣,直到字符串有一個(gè)字符,與搜索詞的第一個(gè)字符相同為止。

4.

接著比較字符串和搜索詞的下一個(gè)字符,還是相同。

5.

直到字符串有一個(gè)字符,與搜索詞對(duì)應(yīng)的字符不相同為止。

6.

這時(shí),最自然的反應(yīng)是,將搜索詞整個(gè)后移一位,再?gòu)念^逐個(gè)比較。這樣做雖然可行,但是效率很差,因?yàn)槟阋?quot;搜索位置"移到已經(jīng)比較過(guò)的位置,重比一遍。

7.

一個(gè)基本事實(shí)是,當(dāng)空格與D不匹配時(shí),你其實(shí)知道前面六個(gè)字符是"ABCDAB"。KMP算法的想法是,設(shè)法利用這個(gè)已知信息,不要把"搜索位置"移回已經(jīng)比較過(guò)的位置,繼續(xù)把它向后移,這樣就提高了效率。

8.

怎么做到這一點(diǎn)呢?可以針對(duì)搜索詞,算出一張《部分匹配表》(Partial Match Table)。這張表是如何產(chǎn)生的,后面再介紹,這里只要會(huì)用就可以了。

9.

已知空格與D不匹配時(shí),前面六個(gè)字符"ABCDAB"是匹配的。查表可知,最后一個(gè)匹配字符B對(duì)應(yīng)的"部分匹配值"為2,因此按照下面的公式算出向后移動(dòng)的位數(shù):

因?yàn)?6 - 2 等于4,所以將搜索詞向后移動(dòng)4位。

10.

因?yàn)榭崭衽cC不匹配,搜索詞還要繼續(xù)往后移。這時(shí),已匹配的字符數(shù)為2("AB"),對(duì)應(yīng)的"部分匹配值"為0。所以,移動(dòng)位數(shù) = 2 - 0,結(jié)果為 2,于是將搜索詞向后移2位。

11.

因?yàn)榭崭衽cA不匹配,繼續(xù)后移一位。

12.

逐位比較,直到發(fā)現(xiàn)C與D不匹配。于是,移動(dòng)位數(shù) = 6 - 2,繼續(xù)將搜索詞向后移動(dòng)4位。

13.

逐位比較,直到搜索詞的最后一位,發(fā)現(xiàn)完全匹配,于是搜索完成。如果還要繼續(xù)搜索(即找出全部匹配),移動(dòng)位數(shù) = 7 - 0,再將搜索詞向后移動(dòng)7位,這里就不再重復(fù)了。

14.

下面介紹《部分匹配表》是如何產(chǎn)生的。

首先,要了解兩個(gè)概念:"前綴"和"后綴"。 "前綴"指除了最后一個(gè)字符以外,一個(gè)字符串的全部頭部組合;"后綴"指除了第一個(gè)字符以外,一個(gè)字符串的全部尾部組合。

15.

"部分匹配值"就是"前綴"和"后綴"的最長(zhǎng)的共有元素的長(zhǎng)度。以"ABCDABD"為例,

16.

"部分匹配"的實(shí)質(zhì)是,有時(shí)候,字符串頭部和尾部會(huì)有重復(fù)。比如,"ABCDAB"之中有兩個(gè)"AB",那么它的"部分匹配值"就是2("AB"的長(zhǎng)度)。搜索詞移動(dòng)的時(shí)候,第一個(gè)"AB"向后移動(dòng)4位(字符串長(zhǎng)度-部分匹配值),就可以來(lái)到第二個(gè)"AB"的位置。

(完)

分享到:
標(biāo)簽:算法 KMP
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定