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

隨筆 - 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>
            亚洲国产三级在线| 国产午夜精品在线| 国产精品xxxxx| 久热国产精品| 久久激情网站| 久久人人精品| 欧美日韩国产一级片| 欧美日韩精品在线视频| 欧美韩国日本一区| 国产精品第一区| 国内精品久久久久久| 伊人蜜桃色噜噜激情综合| 亚洲国产美女久久久久| av成人黄色| 久久成人精品电影| 欧美激情一区二区久久久| 亚洲国产成人久久| 亚洲综合视频1区| 久久婷婷麻豆| 国产婷婷色一区二区三区在线| 尤物视频一区二区| 性色av一区二区三区红粉影视| 老司机一区二区三区| 亚洲国产成人久久综合| 亚洲美女在线观看| 久久精品盗摄| 亚洲综合电影| 国产精品久久7| 一本色道久久综合亚洲精品不卡| 久久精品1区| 亚洲影院一区| 国产日韩精品电影| 午夜免费日韩视频| 小黄鸭视频精品导航| 欧美性猛交xxxx乱大交蜜桃| 日韩亚洲精品电影| 99精品视频免费观看| 国产精品福利网| 欧美在线视频播放| 老色鬼精品视频在线观看播放| 狠狠久久婷婷| 一区二区成人精品| 国产精品网站在线| 欧美国产日韩精品免费观看| 猛男gaygay欧美视频| 日韩亚洲一区二区| 国外成人在线| 亚洲精品在线视频观看| 国产日韩精品视频一区二区三区| 欧美在线视频导航| 久久国产精彩视频| 久久精品91| 欧美精品午夜视频| 亚洲中字在线| 久久男人av资源网站| 亚洲人体1000| 亚洲自拍都市欧美小说| 在线观看一区| 亚洲欧美日本日韩| 一本大道久久a久久综合婷婷 | 久久九九全国免费精品观看| 国产精品久久久一区二区三区| 欧美一区二区三区在线观看视频| 久久国产精品99国产精| 亚洲色无码播放| 久久久久成人精品| 久久aⅴ乱码一区二区三区| 久久久久久夜| 久久精品免视看| 欧美日韩视频在线一区二区 | 欧美一区深夜视频| 免费久久精品视频| 久久精品一区二区三区中文字幕| 欧美精品少妇一区二区三区| 免费不卡在线视频| 狠狠狠色丁香婷婷综合久久五月| 亚洲综合视频网| 欧美一区1区三区3区公司| 欧美日韩在线高清| 日韩网站在线| 亚洲欧美美女| 国产乱肥老妇国产一区二| 亚洲国产精品激情在线观看| 一区二区冒白浆视频| 亚洲自拍三区| 欧美日韩国产免费观看| 亚洲人妖在线| 欧美一级黄色录像| 国内精品久久久久久久果冻传媒 | 最新亚洲视频| 欧美激情在线| 亚洲欧美国产另类| 久久最新视频| 亚洲在线观看视频| 国内精品一区二区三区| 欧美www在线| 欧美一区二区视频97| 久久久久久久97| 国产一区二区日韩精品| 亚洲激情网站| 欧美日韩一区国产| 性伦欧美刺激片在线观看| 亚洲电影免费在线观看| 亚洲欧美成人一区二区三区| 红桃视频欧美| 国产一区二区三区电影在线观看| 米奇777超碰欧美日韩亚洲| 亚洲一级特黄| 在线视频亚洲| 久久久久国产精品一区二区| 欧美亚州在线观看| 亚洲人成77777在线观看网| 99精品免费| 欧美成年人在线观看| 国产美女一区| 国产精品美女久久久久av超清| 久久久国产精品一区| 久久久久久久久蜜桃| 久久麻豆一区二区| 免费观看欧美在线视频的网站| 欧美一级精品大片| 久久精品视频在线| 老鸭窝亚洲一区二区三区| 麻豆成人av| 国产精品a久久久久久| 国产精品久久一区主播| 国产一二三精品| 亚洲一区二区av电影| 一区二区免费看| 久久精品视频亚洲| 国产女主播一区二区| 一本一道久久综合狠狠老精东影业| 亚洲午夜在线观看视频在线| 欧美在线影院在线视频| 欧美成人在线网站| 亚洲综合电影一区二区三区| 久久五月婷婷丁香社区| 国产欧美一区二区三区在线老狼| 亚洲精品在线观看免费| 久久久97精品| 欧美一区三区三区高中清蜜桃| 欧美色欧美亚洲高清在线视频| 亚洲精品黄网在线观看| 裸体一区二区三区| 久久婷婷影院| 亚洲精品日韩一| 亚洲精品自在久久| 午夜精品一区二区三区四区| 男女激情视频一区| 一本一本a久久| 国内外成人免费激情在线视频| 欧美国产日韩a欧美在线观看| 国产精品老牛| 正在播放亚洲| 国产一区二区三区直播精品电影| 猫咪成人在线观看| 欧美日韩一区二区三区视频| 亚洲小少妇裸体bbw| 在线综合+亚洲+欧美中文字幕| 欧美日韩在线播放| 久久国产毛片| 老司机凹凸av亚洲导航| 99av国产精品欲麻豆| 国产精品99久久久久久白浆小说| 国产三区精品| 亚洲精品国产视频| 国产亚洲午夜高清国产拍精品| 欧美大秀在线观看| 国产亚洲欧美另类中文| 日韩亚洲精品在线| 91久久久亚洲精品| 亚洲国产精品一区| 国产精品入口福利| 亚洲韩国青草视频| 久久精品导航| 美女网站在线免费欧美精品| 国产精品久久午夜| 日韩一区二区电影网| 亚洲国产综合在线| 猫咪成人在线观看| 久热精品视频在线观看| 国产九区一区在线| 日韩一级精品视频在线观看| 国产在线欧美日韩| 久久精品国产99国产精品| 欧美中文字幕在线播放| 国产精品卡一卡二| 午夜视频在线观看一区二区三区| 亚洲一区视频| 国精品一区二区三区| 久久国产主播精品| 免费日韩成人| 亚洲欧美日韩在线一区| 一区二区三区中文在线观看| 欧美日韩不卡在线| 亚洲摸下面视频| 99re在线精品| 亚洲精品中文字幕在线| 欧美成人国产va精品日本一级| 欧美一级大片在线观看|