第四章-串&有關(guān)KMP算法方面的總結(jié)-2019-03-05

char? ? cStr[] = "abc";串長為3 數(shù)組的長度為4(應(yīng)為有個'\0')

串的存儲結(jié)構(gòu) ,對于我來說怎么都不會定義一個數(shù)據(jù)結(jié)構(gòu)屿愚,書上這么說溉箕,就多寫一遍加深記憶

typedef struct str

{

? ? ? ? int? ? str[maxSize+1];

? ? ? ? int? ? nLength;

}str;

或者

typedef struct str

{

? ? ? ? char *ch;

? ? ? ? int? ? nLength;

}str;


KMP算法

????????這個真是拒炎,看了別人的書感覺寫的怪怪的,不符合自己的思維方式择葡〗粑洌看視頻,知道怎么用敏储,怎么寫阻星,還是感覺自己的理論并沒有那么清晰,所以還是自己整理一下已添,加深印象妥箕。以前對這些算法不太重視,真看進(jìn)去感覺還是挺有意思的更舞。

?如在a b a b c a b c a c b a b查找是否有a b a b a b b

? ? 術(shù)語:

? ? 1畦幢、模式匹配:對一個串中某子串的定位操作

? ? 2、模式串:待定位的子串缆蝉,既(a b a b a b b?

普通匹配比較宇葱,挨個比較會比較慢,如下圖

? p1? ? ? ? ? ? ? a b a b???? c ????a b c a c b a b

? ?p2? ? ? ? ? ? ?a b a b???? a ????b b?

當(dāng)開始比較的的時候abab都相等刊头,到c處才發(fā)現(xiàn)不等黍瞧,這時p2需從頭開始與p1的b處開始的地方進(jìn)行比較,即:

? p1? ? ? ? ? ? ? a b a b c a b c a c b a b? ? ?

? p2? ? ? ? ? ? ? ? ?a b a b a b b?

依次類推原杂,知道查到有子串或者沒有子串與模式串完全相等

KMP算法

? p1? ? ? ? ? ? ? a b a b?????c?????a b c a c b a b? ?

? p2? ? ? ? ? ? ? a b a b?????a?????b b?

當(dāng)p1雷逆,p2在不等的位置,p2往后移污尉,與p1匹配的過程中,有些步驟完全可以省略掉往产,如在p2總被碗,只看a前面的字母,即下圖加粗的地方

? ?p1? ? ? ? ? ? ? a b a b?????c?????a b c a c b a b? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)? ? ? ? ? ? ? ??

? ?p2? ? ? ? ? ? ??a b a b?????a?????b b? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)?

? ? ? p2? ? ? ? ? ? ? a b a? ? ? b???? a b b? ?(p2往后移了1個位置)? ? ? ? ? (3)

? ?????????p2? ? ? ? ? ? a b? ? ? a???? b a b b? ?(p2往后移了2個位置)? ? ? (4)

????????????會發(fā)現(xiàn)仿村,并不是所有的字符都匹配p1總的前面的字符都匹配锐朴,例如(3)。如果能從(2)直接跳躍到(4)蔼囊,然后對下圖(1)和(4)中的c和a進(jìn)行比較則能夠省去很多步驟焚志。

? ?p1? ? ? ? ? ? ??a b a b?????c?????a b c a c b a b? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)? ?

? ?????????p2? ? ? ? ? ??a b? ? ? a???? b a b b? ?(p2往后移了2個位置)?? ? ? (4)

怎樣才能保證從(2)跳到(4)呢衣迷,這里,必須保證(4)中a前加黑的地方相等與(2)中p2的a前面的加黑部分酱酬,以為如果加黑的部分不相等壶谒,根本就走不到(4)的? ? a? ? 處,也就無從談匹配了膳沽。其實也就是說abab這四個字母汗菜,前面的順序ab必須等于后面的ab。

? ?p2? ? ? ? ? ? ??a b a b?????a?????b b? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)?

? ?????????p2? ? ? ? ? ??a b? ? ??a???? b a b b? ?(p2往后移了2個位置)?? ? ? (4)?

{

? ? ? ? 附錄:

? ? ? ? ? ? ? ? 最長公共前后綴的求法挑社,如a b a b a b b陨界,下面所有的例子也拿書上這一串代碼做說明

? ? ? ? ? ? ? ? 前綴? ? ? ? ? ? ? ? 公共前后綴? ? ? ? 長度

? ? ? ? ? ? ? ? a? ? ? ? ? ? ? ? ? ? ? ? 無? ? ? ? ? ? ? ? ? ? ? ? ?0

? ? ? ? ? ? ? ? ab? ? ? ? ? ? ? ? ? ? ? ?無? ? ? ? ? ? ? ? ? ? ? ? 0

? ? ? ? ? ? ? ? aba? ? ? ? ? ? ? ? ? ? a? ? ? ? ? ? ? ? ? ? ? ? ? ?1

? ? ? ? ? ? ? ? ab?ab? ? ? ? ? ? ? ? ? ?ab? ? ? ? ? ? ? ? ? ? ? ?2(加粗部分上這一串字符前后最長相等的字符串,其長度為2)

? ? ? ? ? ? ? ? ababa? ? ? ? ? ? ? ? ?aba? ? ? ? ? ? ? ? ? ? ? 3

? ? ? ? ? ? ? ? ababab? ? ? ? ? ? ? ? abab? ? ? ? ? ? ? ? ? ?4

我們把公共前后綴的長度+1(為啥要+1呢痛阻,一位前面的都匹配了菌瘪,做的是+1位置與當(dāng)前主串位置匹配的地方的比較),保存到數(shù)組next[]中阱当,改數(shù)組從next[1] = 0開始俏扩,也就是

next[]數(shù)組中從1-7分別保存了0,1,1,2,3,4,5。

}

其實求出next[]的信息斗这,也就把kmp算法最難得部分解決了动猬,其他的就是根據(jù)next[]做相應(yīng)的比較運(yùn)算。

KMP算法的改進(jìn)

{

????????????????對于字符串a(chǎn) a a a a b

? ? ? ? ? ? next[]的信息為0 1 2 3 4 5?

列出來如下表

字符串????????a? ? a? ? a? ? a? ? a? ? b

????j? ? ? ? ? ? ? 1? ? 2? ? 3? ? 4? ? 5? ? ?6

?next[ j ]? ? ? ?0? ?1? ? ?2? ? 3? ? 4? ? 5(j的值就是上面加粗的對應(yīng)的表箭,next[6] == 5赁咙,next[2] == 1)

根據(jù)kmp算法,如果在b處發(fā)生不匹配免钻,這返回next[6]處彼水,即j=5處與字母a進(jìn)行比較,如果又發(fā)生不匹配极舔,這返回到next[5],即j=4處進(jìn)行比較凤覆;如果又發(fā)生不匹配,這返回到next[4],即j=3處進(jìn)行比較拆魏,依次盯桦,知道next[j]==0或者找到發(fā)生匹配的地方。

這里我們會發(fā)現(xiàn)另外一個問題渤刃,如果在j=5處與字母a不匹配拥峦,則相應(yīng)的與j=4處的字母a也不發(fā)生匹配,這樣分析的話卖子,我們在kmp的時候多做了很多的無用功略号,所以呢,我們可以作為改進(jìn),求另外一個nextval[]數(shù)組玄柠,來知道算法比較的時候跳躍到的地方突梦。

字符串????????a? ? b? ? a? ? b? ? a? ? a? ? b?

????j? ? ? ? ? ? ? ?1? ? 2? ? 3? ? 4? ? 5? ? ?6? ?7?

?next[?j?]? ? ? ?0? ? 1????1? ? 2? ? 3? ? 4? ? 2?

nextval[ j ]? ? 0? ? 1? ? 0? ? 1? ? 0? ? 4? ? 1

j=2對應(yīng)的nextval[2]的值為1是怎么來的呢:在j=2處如果發(fā)生不匹配,根據(jù)kmp算法首先跳到next[ 2 ],即j=1的地方進(jìn)行匹配羽利,這時我們發(fā)現(xiàn)j=1對應(yīng)的是字母a宫患,因為a不等于b,所以給nextval賦值為j铐伴,即為1(加粗的地方就是要賦值給nextval的值)撮奏。

j=2對應(yīng)的nextval[3]的值為0是怎么來的呢 :

在j=3處如果發(fā)生不匹配,根據(jù)kmp算法首先跳到next[ 3],即j=1的地方進(jìn)行匹配当宴,這時我們發(fā)現(xiàn)j=1對應(yīng)的是字母a畜吊,因為a==a,發(fā)現(xiàn)相同户矢,這時候nextval[ 3 ]的值=nextval[ 1 ]的值玲献,即為0。

j=6對應(yīng)的nextval[6]的值為4是怎么來的呢 : 在j=6處如果發(fā)生不匹配梯浪,根據(jù)kmp算法首先跳到next[ 6],即j=4的地方進(jìn)行匹配捌年,這時我們發(fā)現(xiàn)j=4對應(yīng)的是字母b,因為a挂洛!=b礼预,這時候nextval[ 6 ]的值等于j的值,即為4虏劲。?

就這么來的……不寫了……算出這些玩意托酸,其他的就沒意思了。

發(fā)現(xiàn)自己寫的估計除了我看柒巫,比人看更蛋疼励堡。

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堡掏,隨后出現(xiàn)的幾起案子应结,更是在濱河造成了極大的恐慌,老刑警劉巖泉唁,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹅龄,死亡現(xiàn)場離奇詭異,居然都是意外死亡亭畜,警方通過查閱死者的電腦和手機(jī)扮休,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贱案,“玉大人,你說我怎么就攤上這事”ψ伲” “怎么了侨糟?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘩燥。 經(jīng)常有香客問我秕重,道長,這世上最難降的妖魔是什么厉膀? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任溶耘,我火速辦了婚禮,結(jié)果婚禮上服鹅,老公的妹妹穿的比我還像新娘凳兵。我一直安慰自己,他們只是感情好企软,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布庐扫。 她就那樣靜靜地躺著,像睡著了一般仗哨。 火紅的嫁衣襯著肌膚如雪形庭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天厌漂,我揣著相機(jī)與錄音萨醒,去河邊找鬼。 笑死苇倡,一個胖子當(dāng)著我的面吹牛富纸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雏节,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼胜嗓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钩乍?” 一聲冷哼從身側(cè)響起辞州,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寥粹,沒想到半個月后变过,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涝涤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年媚狰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阔拳。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡崭孤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辨宠,我是刑警寧澤遗锣,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站嗤形,受9級特大地震影響精偿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋兵,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一笔咽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霹期,春花似錦叶组、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帕膜,卻和暖如春枣氧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垮刹。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工达吞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荒典。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓酪劫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寺董。 傳聞我的和親對象是個殘疾皇子覆糟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,977評論 0 13
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,333評論 0 2
  • 前言 最先接觸編程的知識是在大學(xué)里面滩字,大學(xué)里面學(xué)了一些基礎(chǔ)的知識,c語言御吞,java語言麦箍,單片機(jī)的匯編語言等;大學(xué)畢...
    oceanfive閱讀 3,048評論 0 7
  • 一陶珠、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 5,793評論 2 16
  • 我喜歡這一刻的孤單的想你未來的你我不希望你是藍(lán)色穹頂?shù)脑菩跻驗轱L(fēng)會帶走你最好是讓風(fēng)一聲嘆息的沉默最浪漫的人一定是火...
    青眠谷雨閱讀 205評論 0 0