【KMP演算法改進】C++
阿新 • • 發佈:2018-11-09
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演算法。
除此之外,可能還有需要改進的原因,繼續,去探索。
嘻嘻,我的小米衣服快到了