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

勤能補(bǔ)拙,Expter

成都游戲Coder,記錄游戲開(kāi)發(fā)過(guò)程的筆記和心得!

KMP 算法筆記

KMP算法是查詢子串比較快的一種算法!

我們先看普通的模式匹配算法。。
int Index(String S,String T,int pos)//參考《數(shù)據(jù)結(jié)構(gòu)》中的程序
{
  i
=pos;j=1;//這里的串的第1個(gè)元素下標(biāo)是1
  while(i<=S.Length && j<=T.Length)
  {
    
if(S[i]==T[j]){++i;++j;}
    
else{i=i-j+2;j=1;}//**************(1)
  }
  
if(j>T.Length) return i-T.Length;//匹配成功
  else return 0;
}
匹配的過(guò)程非常清晰,關(guān)鍵是當(dāng)‘失配’的時(shí)候進(jìn)行回溯!

看下面的例子:

S:aaaaabababcaaa  T:ababc

aaaaabababcaaa
    ababc.(.表示前一個(gè)已經(jīng)失配)
回溯的結(jié)果就是
aaaaabababcaaa
     a.(babc)
如果不回溯就是
aaaaabababcaaa
        aba.bc
這樣就漏了一個(gè)可能匹配成功的情況
aaaaabababcaaa
      ababc



為什么會(huì)發(fā)生這樣的情況?這是由T串本身的性質(zhì)決定的,是因?yàn)門串本身有前后'部分匹配'的性質(zhì)。如果T為abcdef這樣的,大沒(méi)有回溯的必要。

改進(jìn)的地方也就是這里,我們從T串本身出發(fā),事先就找準(zhǔn)了T自身前后部分匹配的位置,那就可以改進(jìn)算法。

如果不用回溯,那T串下一個(gè)位置從哪里開(kāi)始呢?

還是上面那個(gè)例子,T為ababc,如果c失配,那就可以往前移到aba最后一個(gè)a的位置,像這樣:
...ababd...
   ababc
   ->ababc

這樣i不用回溯,j跳到前2個(gè)位置,繼續(xù)匹配的過(guò)程,這就是KMP算法所在。這個(gè)當(dāng)T[j]失配后,j應(yīng)該往前跳的值就是j的next值,它是由T串本身固有決定的,與S串無(wú)關(guān)。

《數(shù)據(jù)結(jié)構(gòu)》上給了next值的定義:
          
0   如果j=1
next[j]
={Max{k|1<k<j且'p1pk-1'='pj-k+1pj-1'
          
1   其它情況

我當(dāng)初看到這個(gè)頭就暈了,其實(shí)它就是描述的我前面表述的情況,關(guān)于next[1]=0是規(guī)定的,這樣規(guī)定可以使程序簡(jiǎn)單一些,如果非要定為其它的值只要不和后面的值沖突也是可以的;而那個(gè)Max是什么意思,舉個(gè)例子:

T:aaab

...aaaab...
   aaab
  ->aaab
   ->aaab
    ->aaab

像這樣的T,前面自身部分匹配的部分不止兩個(gè),那應(yīng)該往前跳到第幾個(gè)呢?最近的一個(gè),也就是說(shuō)盡可能的向右滑移最短的長(zhǎng)度。

OK,了解到這里,就看清了KMP的大部分內(nèi)容,然后關(guān)鍵的問(wèn)題是如何求next值?先不管它,先看如何用它來(lái)進(jìn)行匹配操作,也就是說(shuō)先假設(shè)已經(jīng)有了next值。

將最前面的程序改寫成:

int Index_KMP(String S,String T,int pos)
{
  i
=pos;j=1;//這里的串的第1個(gè)元素下標(biāo)是1
  while(i<=S.Length && j<=T.Length)
  {
    
if(j==0 || S[i]==T[j]){++i;++j;} //注意到這里的j==0,和++j的作用就知道為什么規(guī)定next[1]=0的好處了
    else j=next[j];//i不變(不回溯),j跳動(dòng)
  }
  
if(j>T.Length) return i-T.Length;//匹配成功
  else return 0;
}

OK,是不是非常簡(jiǎn)單?還有更簡(jiǎn)單的,求next值,這也是整個(gè)算法成功的關(guān)鍵,從next值的定義來(lái)求太恐怖了,怎么求?前面說(shuō)過(guò)了,next值 表達(dá)的就是T串的自身部分匹配的性質(zhì),那么,我只要將T串和T串自身來(lái)一次匹配就可以求出來(lái)了,這里的匹配過(guò)程不是從頭一個(gè)一個(gè)匹配,而是從T[1]和T [2]開(kāi)始匹配,給出算法如下:

void get_next(String T,int &next[])
{
  i
=1;j=0;next[1]=0;
  
while(i<=T.Length)
  {
    
if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}
    
else j=next[j];
  }
}
注意到(2)語(yǔ)句邏輯覆蓋的時(shí)候是T[i]==T[j]以及i前面的、j前面的都匹配的情況下,于是先自增,然后記下來(lái)next[i]=j,這樣每當(dāng)i有 自增就會(huì)求得一個(gè)next[i],而j一定會(huì)小于等于i,于是對(duì)于已經(jīng)求出來(lái)的next,可以繼續(xù)求后面的next,而next[1]=0是已知,所以整 個(gè)就這樣遞推的求出來(lái)了,方法非常巧妙。

posted on 2008-12-06 10:23 expter 閱讀(268) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 其他學(xué)習(xí)筆記算法與數(shù)據(jù)結(jié)構(gòu)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲综合第一页| 亚洲久久视频| 亚洲人成毛片在线播放| 国产美女精品一区二区三区| 亚洲一区二区三区在线看| 久久久噜噜噜久久中文字免| 国产亚洲福利社区一区| 免费观看30秒视频久久| 欧美高清一区| 1000部国产精品成人观看| 久久精品成人一区二区三区蜜臀| 亚洲乱码国产乱码精品精98午夜| 国产精品99久久久久久有的能看| 欧美国产精品一区| 欧美伦理91| 欧美国产日韩二区| 国产精品99久久不卡二区| 久久精品理论片| 午夜精品一区二区三区在线播放| 在线欧美小视频| 美女视频一区免费观看| 久久久人成影片一区二区三区观看| 一区二区三区四区五区精品| 麻豆久久久9性大片| 国产精品99久久久久久www| 国产午夜亚洲精品不卡| 久久久夜色精品亚洲| 欧美一区二区高清在线观看| 最新中文字幕一区二区三区| 国产综合婷婷| 亚洲高清免费在线| 亚洲高清色综合| 国产色产综合色产在线视频| 国产一区二区日韩精品欧美精品 | 蜜臀99久久精品久久久久久软件 | 欧美精品99| 国产精品萝li| 国产欧美va欧美va香蕉在| 国产精品视频精品| 黄色成人片子| 亚洲大胆人体在线| 午夜视频久久久| 亚洲二区精品| 久久久精品国产一区二区三区 | 亚洲免费在线视频| 免费欧美在线| 欧美成人性网| 91久久精品国产91久久性色| 亚洲黄色在线| 国产精品久线观看视频| 国产精品豆花视频| 国产一区二区三区久久 | 99精品国产热久久91蜜凸| av成人激情| 亚洲乱码视频| 久久久无码精品亚洲日韩按摩| 欧美日韩大片一区二区三区| 国内成人精品一区| 久久国产精品一区二区三区| 久久婷婷久久| 午夜精品在线观看| 欧美日韩国产综合视频在线观看| 国产综合第一页| 欧美在线视屏 | 一区二区亚洲精品国产| 欧美诱惑福利视频| 欧美91视频| 久久国产黑丝| 久久人人97超碰人人澡爱香蕉| 99视频精品免费观看| 亚洲男人av电影| 亚洲国产精品v| 一本色道久久99精品综合| 黄色亚洲免费| 亚洲精品日韩欧美| 国产精品第三页| 欧美亚洲视频一区二区| 欧美一级淫片播放口| 91久久久久| 一本一本久久| 国产欧美日韩一区二区三区在线观看| 欧美成黄导航| 国语自产偷拍精品视频偷| 欧美日韩亚洲三区| 精品成人一区二区三区| 久久精品视频在线观看| 欧美日韩国产电影| 欧美国产视频在线观看| 国产啪精品视频| 亚洲午夜一区二区三区| 宅男噜噜噜66一区二区| 国产精品人人做人人爽人人添| 亚洲精品一线二线三线无人区| 国产日韩精品在线| 亚洲欧美精品伊人久久| 久久蜜桃av一区精品变态类天堂| 韩国精品久久久999| 久久久久久午夜| 亚洲国产精品激情在线观看| 亚洲午夜国产成人av电影男同| 欧美日本精品| 欧美伊人久久久久久久久影院| 久久久午夜视频| 亚洲欧美怡红院| 亚洲欧洲在线一区| 欧美午夜国产| 久久久五月婷婷| 欧美www视频| 欧美午夜精品久久久久久超碰| 欧美成人嫩草网站| 欧美亚洲视频| 国产精品一区久久| 在线一区二区三区四区| 亚洲欧美成人综合| 国产日韩在线视频| 夜夜嗨av一区二区三区| 亚洲高清在线播放| 久久久91精品国产一区二区三区 | 久久免费国产| 亚洲综合另类| 一区二区三区免费网站| 国产精品久久77777| 91久久综合亚洲鲁鲁五月天| 一本色道久久加勒比88综合| 国产欧美日韩精品专区| 欧美国产第二页| 久久久亚洲高清| 亚洲黄色在线| 欧美一区二区三区在线看| 最新国产の精品合集bt伙计| 欧美性大战久久久久久久蜜臀| 牛牛影视久久网| 日韩一区二区精品葵司在线| 日韩午夜中文字幕| 91久久国产综合久久| 久久成年人视频| 亚洲精品护士| 亚洲自拍电影| 久久成人综合视频| 性色av一区二区三区红粉影视| 蜜臀久久99精品久久久画质超高清| 午夜精品美女久久久久av福利| 亚洲精品视频在线播放| 一区二区高清视频| 亚洲激情午夜| 午夜精品在线视频| 亚洲区国产区| 国内成人在线| 欧美在线视频日韩| 99re热精品| 亚洲婷婷综合色高清在线| 国内精品视频在线观看| 欧美一区二区在线观看| 亚洲区一区二| 久久综合伊人77777| 欧美日韩二区三区| 欧美日韩国产精品一区| 免费在线看一区| 国产精品毛片| 蜜臀久久99精品久久久画质超高清 | 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品99免费看| 亚洲午夜在线观看视频在线| 欧美xxxx在线观看| 久久狠狠一本精品综合网| 国产精品劲爆视频| 亚洲成色www久久网站| 中文在线资源观看网站视频免费不卡| 久久亚洲综合网| 亚洲精品之草原avav久久| 久久综合五月天婷婷伊人| 国产一区二区视频在线观看| 欧美中文字幕不卡| 久久久久久久成人| 在线视频你懂得一区二区三区| 亚洲午夜国产成人av电影男同| 久久国产婷婷国产香蕉| 免费观看一区| 久久精品国产96久久久香蕉| 欧美日本国产精品| 久久综合国产精品| 欧美午夜视频| 欧美一区二区成人| 日韩视频在线播放| 麻豆国产精品777777在线| 欧美二区在线播放| 久久精品欧美日韩精品| 久久久久国产一区二区| 国产精品99久久久久久白浆小说 | 一本久久精品一区二区| 欧美日韩激情小视频| 性欧美video另类hd性玩具| 国产日韩一区二区三区在线| 欧美激情视频一区二区三区在线播放| 国产精品亚洲网站| 制服丝袜亚洲播放| 99综合精品| 欧美激情按摩在线| 一区二区在线视频观看| 亚洲一区影音先锋|