日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

KMP-next数组

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KMP-next数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前看的模模糊糊現在終于清楚了。

主要是這一段代碼的問題

void getkmp()
{int k=-1,j=0;nex[0]=-1;while(j<m){if(k==-1||b[j]==b[k]){k++;j++;nex[j]=k;}elsek=nex[k];}
}

next[j]表示b串0~j-1的最長前綴后綴字串的長度//特別重要

例如b數組:? a? b a a b b a b a a b

那next數組:-1 0 0?1 1 2 0 1 2 3 4 5

設用b串來匹配大串a

設next[j]=x;

一個可以確定的就是,b串的0~x-1 j-x~j-1?的元素是相同的

然后開始匹配,展示復雜度會被優化的地方。

串串是從i=0開始記錄的

設a:abcdabcdabce? 變量用j

設b:abcdabce 變量用k

a和b一個一個匹配到了a[7]='d' , b[7]='e',不相等了,然后此時k=j=7;

然后你知道了0~6他們倆都是匹配的,這個時候可以直接k=next[k]=3;j此時還是7

開始問自己,為啥k=next[k]呢?

想要從a串中找到一個b串的話,現成的匹配成功的部分就剩下了b數組的0~next[k]-1;

也就是說a的4~6(a[j-3]~a[j-1])部分與b串中的0~2,都是下劃線部分相同。

這時候你就比較a[j]與b[ next[k] ]不相等就完了,此時的話就是a[7]與b[3],相等話接著匹配,直到j=b串長度的時候就相當于你匹配成功,不然就吧j繼續等于next[j],反正就是能與a串盡可能相同的部分。如果一直next【k】下去等于-1,那么就沒用相等的,重新從b[0]與a[j]匹配,就跟剛開始的狀態是一樣的。

然后就是找next數組的過程,其實與找匹配的原理一樣。自己模擬一邊就懂了。

總結

以上是生活随笔為你收集整理的KMP-next数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。