1. 程式人生 > >【KMP演算法改進】C++

【KMP演算法改進】C++

mark明天來和順便描述一下原本kmp,

kmp和bf演算法 在文字串 i=0時匹配就成功的話基本相同,且bf不用計算next陣列,、

然而bf演算法,如果匹配失敗,會從i=1,i=2,逐個逐個的匹配,浪費時間

kmp演算法,在發現匹配失敗的時候,文字串匹配失敗位置前面的字串是匹配好的,這一段同樣會出現在模式串同樣位置上,kmp演算法會查模式串匹配失敗位置處的next陣列值,鑑於字首字尾相同的原因,讓模式串含有字首的地方和文字串含有後綴的地方重合在一起,進行下一次匹配。提高效率。

然而有幾個問題。

1,假設kmp演算法在i=0處就匹配失敗怎麼辦。

i=0處,失敗,i=1,重新匹配

next陣列為 -1,所以 j=-1,i=0 進入if語句,++j  ,  j=0,++i,i=1,text[  1  ] 和 patten[   0  ],繼續匹配,

i=1,在失敗,i=2 ,重新匹配

可見如果剛開始就匹配失敗,沒有體現kmp演算法優點,kmp演算法優點在於某次匹配失敗後,還能讓儘可能相同的部分相匹配,跳過不可能的地方。

2,假設文字串為 a a a b a a a a b,模式串為a a a a b。

如果未改進就會在第一次匹配i=0,下 在i=3,j=3,失敗

然後 i3 / j2, i3 / j 1,i3 / j0.連續匹配失敗好多次,跳出i3後 到 i4 /j0  才成功,因此還需改進kmp演算法。

除此之外,可能還有需要改進的原因,繼續,去探索。

嘻嘻,我的小米衣服快到了