青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 5  文章 - 2  trackbacks - 0
<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice. All you have to decide is what to do with the time that is given to you. Get busy Living, or Get busy Dying?

常用鏈接

留言簿

隨筆分類(4)

隨筆檔案(5)

文章分類(88)

文章檔案(10)

Andriod

Language

OpenCV&OpenSSLink

OpenSource

Others

Python&Ruby

WP7

WTL

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

???
?? 如果機(jī)房馬上要關(guān)門了,或者你急著要和MM約會(huì),請(qǐng)直接跳到第六個(gè)自然段。
我們這里說的KMP不是拿來放 電影的(雖然我很喜歡這個(gè)軟件),而是一種算法。KMP算法是拿來處理字符串匹配的。換句話說,給你兩個(gè)字符串,你需要回答,B串是否是A串的子串(A串 是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我們就說B是A的子串。你可以委婉地問你的MM:“假如你要向你喜歡的人表白的話,我的名字是你的告白 語(yǔ)中的子串嗎?”
????解決這類問題,通常我們的方法是枚舉從A串的什么位置起開始與B匹配,然后驗(yàn)證是否匹配。假如A串長(zhǎng)度為n,B串長(zhǎng)度為 m,那么這種方法的復(fù)雜度是O (mn)的。雖然很多時(shí)候復(fù)雜度達(dá)不到mn(驗(yàn)證時(shí)只看頭一兩個(gè)字母就發(fā)現(xiàn)不匹配了),但我們有許多“最壞情況”,比如,A= "aaaaaaaaaaaaaaaaaaaaaaaaaab",B="aaaaaaaab"。我們將介紹的是一種最壞情況下O(n)的算法(這里假設(shè) m<=n),即傳說中的KMP算法。
????之所以叫做KMP,是因?yàn)檫@個(gè)算法是由Knuth、Morris、Pratt三個(gè)提出來的,取 了這三個(gè)人的名字的頭一個(gè)字母。這時(shí),或許你突然明白了AVL 樹為什么叫AVL,或者Bellman-Ford為什么中間是一杠不是一個(gè)點(diǎn)。有時(shí)一個(gè)東西有七八個(gè)人研究過,那怎么命名呢?通常這個(gè)東西干脆就不用人名 字命名了,免得發(fā)生爭(zhēng)議,比如“3x+1問題”。扯遠(yuǎn)了。
????個(gè)人認(rèn)為KMP是最沒有必要講的東西,因?yàn)檫@個(gè)東西網(wǎng)上能找到很多資料。但網(wǎng)上 的講法基本上都涉及到“移動(dòng)(shift)”、“Next函數(shù)”等概念,這非常容易產(chǎn)生誤解(至少一年半前我看這些資料學(xué)習(xí)KMP時(shí)就沒搞清楚)。在這 里,我換一種方法來解釋KMP算法。

????假如,A="abababaababacb",B="ababacb",我們來看看KMP 是怎么工作的。我們用兩個(gè)指針i和j分別表示,A[i-j+ 1..i]與B[1..j]完全相等。也就是說,i是不斷增加的,隨著i的增加j相應(yīng)地變化,且j滿足以A[i]結(jié)尾的長(zhǎng)度為j的字符串正好匹配B串的前 j個(gè)字符(j當(dāng)然越大越好),現(xiàn)在需要檢驗(yàn)A[i+1]和B[j+1]的關(guān)系。當(dāng)A[i+1]=B[j+1]時(shí),i和j各加一;什么時(shí)候j=m了,我們就 說B是A的子串(B串已經(jīng)整完了),并且可以根據(jù)這時(shí)的i值算出匹配的位置。當(dāng)A[i+1]<>B[j+1],KMP的策略是調(diào)整j的位置 (減小j值)使得A[i-j+1..i]與B[1..j]保持匹配且新的B[j+1]恰好與A[i+1]匹配(從而使得i和j能繼續(xù)增加)。我們看一看當(dāng) i=j=5時(shí)的情況。

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B = a b a b a c b
????j = 1 2 3 4 5 6 7


????此 時(shí),A[6]<>B[6]。這表明,此時(shí)j不能等于5了,我們要把j改成比它小的值j'。j'可能是多少呢?仔細(xì)想一下,我們發(fā)現(xiàn),j'必須 要使得B[1..j]中的頭j'個(gè)字母和末j'個(gè)字母完全相等(這樣j變成了j'后才能繼續(xù)保持i和j的性質(zhì))。這個(gè)j'當(dāng)然要越大越好。在這里,B [1..5]="ababa",頭3個(gè)字母和末3個(gè)字母都是"aba"。而當(dāng)新的j為3時(shí),A[6]恰好和B[4]相等。于是,i變成了6,而j則變成了 4:

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B =???? a b a b a c b
????j =???? 1 2 3 4 5 6 7


????從 上面的這個(gè)例子,我們可以看到,新的j可以取多少與i無關(guān),只與B串有關(guān)。我們完全可以預(yù)處理出這樣一個(gè)數(shù)組P[j],表示當(dāng)匹配到B數(shù)組的第j個(gè)字母而 第j+1個(gè)字母不能匹配了時(shí),新的j最大是多少。P[j]應(yīng)該是所有滿足B[1..P[j]]=B[j-P[j]+1..j]的最大值。
????再后來,A[7]=B[5],i和j又各增加1。這時(shí),又出現(xiàn)了A[i+1]<>B[j+1]的情況:

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B =???? a b a b a c b
????j =???? 1 2 3 4 5 6 7


????由于P[5]=3,因此新的j=3:

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B =???????? a b a b a c b
????j =???????? 1 2 3 4 5 6 7


????這時(shí),新的j=3仍然不能滿足A[i+1]=B[j+1],此時(shí)我們?cè)俅螠p小j值,將j再次更新為P[3]:

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B =???????????? a b a b a c b
????j =???????????? 1 2 3 4 5 6 7


????現(xiàn)在,i還是7,j已經(jīng)變成1了。而此時(shí)A[8]居然仍然不等于B[j+1]。這樣,j必須減小到P[1],即0:

????i = 1 2 3 4 5 6 7 8 9 ……
????A = a b a b a b a a b a b …
????B =?????????????? a b a b a c b
????j =???????????? 0 1 2 3 4 5 6 7


????終于,A[8]=B[1],i變?yōu)?,j為1。事實(shí)上,有可能j到了0仍然不能滿足A[i+1]=B[j+1](比如A[8]="d"時(shí))。因此,準(zhǔn)確的說法是,當(dāng)j=0了時(shí),我們?cè)黾觟值但忽略j直到出現(xiàn)A[i]=B[1]為止。
????這個(gè)過程的代碼很短(真的很短),我們?cè)谶@里給出:

j:=0;
for i:=1 to n do
begin
?? while (j>0) and (B[j+1]<>A[i]) do j:=P[j];
?? if B[j+1]=A[i] then j:=j+1;
?? if j=m then
?? begin
??????writeln('Pattern occurs with shift ',i-m);
??????j:=P[j];
?? end;
end;


????最后的j:=P[j]是為了讓程序繼續(xù)做下去,因?yàn)槲覀冇锌赡苷业蕉嗵幤ヅ洹?br />????這個(gè)程序或許比想像中的要簡(jiǎn)單,因?yàn)閷?duì)于i值的不斷增加,代碼用的是for循環(huán)。因此,這個(gè)代碼可以這樣形象地理解:掃描字符串A,并更新可以匹配到B的什么位置。

????現(xiàn)在,我們還遺留了兩個(gè)重要的問題:一,為什么這個(gè)程序是線性的;二,如何快速預(yù)處理P數(shù)組。
????為 什么這個(gè)程序是O(n)的?其實(shí),主要的爭(zhēng)議在于,while循環(huán)使得執(zhí)行次數(shù)出現(xiàn)了不確定因素。我們將用到時(shí)間復(fù)雜度的攤還分析中的主要策略,簡(jiǎn)單地說 就是通過觀察某一個(gè)變量或函數(shù)值的變化來對(duì)零散的、雜亂的、不規(guī)則的執(zhí)行次數(shù)進(jìn)行累計(jì)。KMP的時(shí)間復(fù)雜度分析可謂攤還分析的典型。我們從上述程序的j 值入手。每一次執(zhí)行while循環(huán)都會(huì)使j減小(但不能減成負(fù)的),而另外的改變j值的地方只有第五行。每次執(zhí)行了這一行,j都只能加1;因此,整個(gè)過程 中j最多加了n個(gè)1。于是,j最多只有n次減小的機(jī)會(huì)(j值減小的次數(shù)當(dāng)然不能超過n,因?yàn)閖永遠(yuǎn)是非負(fù)整數(shù))。這告訴我們,while循環(huán)總共最多執(zhí)行 了n次。按照攤還分析的說法,平攤到每次for循環(huán)中后,一次for循環(huán)的復(fù)雜度為O(1)。整個(gè)過程顯然是O(n)的。這樣的分析對(duì)于后面P數(shù)組預(yù)處理 的過程同樣有效,同樣可以得到預(yù)處理過程的復(fù)雜度為O(m)。
????預(yù)處理不需要按照P的定義寫成O(m^2)甚至O(m^3)的。我們可以通 過P[1],P[2],...,P[j-1]的值來獲得P[j]的值。對(duì)于剛才的B="ababacb",假如我們已經(jīng)求出了 P[1],P[2],P[3]和P[4],看看我們應(yīng)該怎么求出P[5]和P[6]。P[4]=2,那么P [5]顯然等于P[4]+1,因?yàn)橛蒔[4]可以知道,B[1,2]已經(jīng)和B[3,4]相等了,現(xiàn)在又有B[3]=B[5],所以P[5]可以由P[4] 后面加一個(gè)字符得到。P[6]也等于P[5]+1嗎?顯然不是,因?yàn)锽[ P[5]+1 ]<>B[6]。那么,我們要考慮“退一步”了。我們考慮P[6]是否有可能由P[5]的情況所包含的子串得到,即是否P[6]=P[ P[5] ]+1。這里想不通的話可以仔細(xì)看一下:

????????1 2 3 4 5 6 7
????B = a b a b a c b
????P = 0 0 1 2 3 ?


????P[5]=3 是因?yàn)锽[1..3]和B[3..5]都是"aba";而P[3]=1則告訴我們,B[1]、B[3]和B[5]都是"a"。既然P[6]不能由P[5] 得到,或許可以由P[3]得到(如果B[2]恰好和B[6]相等的話,P[6]就等于P[3]+1了)。顯然,P[6]也不能通過P[3]得到,因?yàn)? B[2]<>B[6]。事實(shí)上,這樣一直推到P[1]也不行,最后,我們得到,P[6]=0。
????怎么這個(gè)預(yù)處理過程跟前面的KMP主程序這么像呢?其實(shí),KMP的預(yù)處理本身就是一個(gè)B串“自我匹配”的過程。它的代碼和上面的代碼神似:

P[1]:=0;
j:=0;
for i:=2 to m do
begin
?? while (j>0) and (B[j+1]<>B[i]) do j:=P[j];
?? if B[j+1]=B[i] then j:=j+1;
?? P[i]:=j;
end;


????最后補(bǔ)充一點(diǎn):由于KMP算法只預(yù)處理B串,因此這種算法很適合這樣的問題:給定一個(gè)B串和一群不同的A串,問B是哪些A串的子串。

????串匹配是一個(gè)很有研究?jī)r(jià)值的問題。事實(shí)上,我們還有后綴樹,自動(dòng)機(jī)等很多方法,這些算法都巧妙地運(yùn)用了預(yù)處理,從而可以在線性的時(shí)間里解決字符串的匹配。我們以后來說。

????昨天發(fā)現(xiàn)一個(gè)特別暈的事,知道怎么去掉BitComet的廣告嗎?把界面語(yǔ)言設(shè)成英文就行了。
????還有,金山詞霸和Dr.eye都可以去自殺了,Babylon素王道。
posted on 2010-11-19 19:31 jemmyLiu 閱讀(251) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++BASE
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品粉嫩高潮一区二区| 久久精品在线观看| 欧美韩日亚洲| 久久精品国产精品| 欧美大片第1页| 欧美激情精品久久久久久大尺度 | 亚洲欧美文学| 午夜久久久久久久久久一区二区| 国产精品羞羞答答xxdd| 久久久久久久激情视频| 久久蜜桃香蕉精品一区二区三区| 亚洲大片精品永久免费| 亚洲欧洲日韩综合二区| 欧美日韩高清免费| 欧美中文字幕在线观看| 久久影视精品| 亚洲欧美日产图| 久久影音先锋| 香蕉成人久久| 欧美阿v一级看视频| 午夜视频在线观看一区二区三区| 欧美伊人久久久久久午夜久久久久| 亚洲激情不卡| 亚洲欧美另类在线观看| 亚洲免费观看| 性欧美暴力猛交另类hd| 亚洲精品日韩在线观看| 欧美一级片一区| 9色精品在线| 久久人人爽爽爽人久久久| 亚洲专区欧美专区| 免费在线观看成人av| 欧美专区在线观看| 欧美日韩视频免费播放| 欧美xxx成人| 国产色产综合产在线视频| 91久久久久久| 亚洲第一天堂无码专区| 亚洲免费一区二区| 亚洲视频网在线直播| 欧美电影美腿模特1979在线看| 欧美一级视频精品观看| 欧美日韩精品综合| 欧美激情影音先锋| 在线成人中文字幕| 欧美一区成人| 欧美一区二区三区免费在线看| 欧美极品在线播放| 欧美激情综合| 亚洲国产精品99久久久久久久久| 欧美一级专区| 欧美中文字幕在线观看| 国产精品午夜在线| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲综合视频1区| 99国产精品久久久久久久成人热 | 鲁大师成人一区二区三区| 国产精品对白刺激久久久| 久久精品免费观看| 西瓜成人精品人成网站| 亚洲国产精品第一区二区三区| 国产欧美日韩另类视频免费观看 | 亚洲午夜国产一区99re久久| 欧美电影免费观看大全| 亚洲激情图片小说视频| 亚洲美女区一区| 欧美精品日韩精品| 亚洲美女免费视频| 亚洲网站在线观看| 国产精品久久夜| 午夜精品久久久久99热蜜桃导演| 午夜精品久久久久久久久久久| 国产精品伦子伦免费视频| 制服丝袜亚洲播放| 欧美一区二区视频网站| 国产一区二区视频在线观看| 久久精品国产久精国产爱| 亚洲国内自拍| 亚洲精品国产精品乱码不99 | 日韩一级黄色av| 欧美日韩免费观看一区| 亚洲手机在线| 久久久91精品| 亚洲国产毛片完整版| 欧美剧在线观看| 亚洲自拍三区| 久久一区亚洲| 日韩午夜精品| 国产精品一级二级三级| 欧美在线视频二区| 欧美高清一区二区| 亚洲一区二区动漫| 国产一区欧美| 欧美精品久久久久久久免费观看 | 久久国产高清| 亚洲精品黄网在线观看| 国产精品久久久久久久久久三级 | 国产精品一区二区在线观看| 久久国产88| 亚洲欧洲综合| 欧美伊人久久大香线蕉综合69| 伊甸园精品99久久久久久| 欧美日韩成人一区二区| 性一交一乱一区二区洋洋av| 亚洲国产福利在线| 欧美一区二区在线观看| 亚洲国产国产亚洲一二三| 日韩午夜剧场| 蜜桃av久久久亚洲精品| 亚洲性av在线| 亚洲国产精品久久久久久女王| 国产精品高潮呻吟久久av黑人| 久久久亚洲影院你懂的| 亚洲影音一区| 亚洲毛片在线看| 欧美成人精品福利| 久久九九久久九九| 欧美一级播放| 亚洲视频精选| 亚洲精品乱码久久久久| 黄色一区二区在线| 国产麻豆日韩欧美久久| 欧美日韩调教| 欧美激情一区三区| 久久资源在线| 久久久久久久欧美精品| 欧美在线一级视频| 亚洲欧美日韩网| 亚洲一区二区三区四区在线观看| 亚洲人体大胆视频| 亚洲第一页自拍| 亚洲国产高清一区| 亚洲国产mv| 亚洲第一区在线观看| 欧美大片免费观看| 嫩模写真一区二区三区三州| 久久精品日韩一区二区三区| 欧美一激情一区二区三区| 亚洲女与黑人做爰| 亚洲一区二区三区中文字幕| 一区二区日韩精品| 亚洲午夜精品网| 亚洲一区二区成人| 欧美一区二区三区精品| 欧美一级午夜免费电影| 欧美一站二站| 久久综合中文字幕| 欧美va亚洲va香蕉在线| 欧美成人伊人久久综合网| 欧美高清视频在线| 亚洲国产裸拍裸体视频在线观看乱了| 欧美成人免费全部| 亚洲国产精品ⅴa在线观看| 欧美激情一区二区三级高清视频| 欧美成年人视频网站欧美| 亚洲黄色成人| 99精品视频免费在线观看| 中文精品视频一区二区在线观看| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲国产一区二区在线| 亚洲精品裸体| 亚洲一区尤物| 久久精品首页| 亚洲国产高清一区| 亚洲天堂av在线免费观看| 欧美亚洲日本国产| 麻豆精品在线观看| 欧美视频在线看| 国产在线播精品第三| 在线观看亚洲视频啊啊啊啊| 一本色道久久综合亚洲精品小说| 亚洲综合色激情五月| 久久久噜噜噜| 亚洲日本在线观看| 欧美亚洲一区二区在线观看| 免费日韩av片| 国产欧美精品在线| 亚洲精品国精品久久99热一| 午夜欧美大尺度福利影院在线看| 久久综合久久综合久久综合| 亚洲精品久久久久久久久久久久| 亚洲欧美日韩在线观看a三区| 久热这里只精品99re8久| 国产精品久久久久久久久动漫 | 欧美精品日韩精品| 国模精品一区二区三区| 欧美亚州一区二区三区| 精品999久久久| 亚洲一区二区高清| 亚洲国产精品www| 欧美专区在线观看| 国产精品一区二区男女羞羞无遮挡 | 精品动漫3d一区二区三区免费版 | 一区二区三区毛片| 狂野欧美性猛交xxxx巴西| 亚洲视频视频在线| 欧美大片在线看| 伊人久久av导航| 久久国产精品一区二区| 99一区二区|