KMP演算法學習

來源:互聯網
上載者:User

標籤:開始   字元   學習心得   最大   string   尾碼   class   添加   下標   

最近在看演算法,覺得kmp演算法的一些學習心得可以記錄一下。

我本身是在看《演算法》的,裡面介紹kmp演算法時,實在看的一臉懵逼,就看了別人的心得,這裡推薦2篇博文:

1.阮一峰大大的:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

2.實現1中求next的博文:http://www.cnblogs.com/c-cloud/p/3224788.html

根據1文我實現了kmp,但留空next的求法,畢竟1文也只是大概說了next的意義,對2文我在自己的理解上也自己實現了一波,覺得更加容易懂些吧。

個人添加的理解(也都在注釋裡了):

  1.next的本質是最長共同首碼尾碼,然後在匹配失敗時,指向模板字串的指標直接重設為next[k-1](即重設到最長共同前尾碼的下一個位置),而長字串的指標勿需動,即相當於指標新位置前的那一坨已經匹配成功了,接著從新指標那裡匹配下去即可

  2.(參考下面代碼)計算next時,如果p[i]=p[k]則共同前尾碼+1,不等則在已經匹配成功的部分p[0~k-1]中找最大共同前尾碼next[k-1],然後繼續比較p[i]和p[新k],如果k<=0即得不到已經存在的next的協助了,這時k=0,即木有共同前尾碼了。

// next的本質是最長共同首碼尾碼,然後在匹配失敗時,指向模板字串的指標直接重設為next[k-1],而長字串的指標勿需動,即相當於指標新位置前的那一坨已經匹配成功了,接著從新指標那裡匹配下去即可    void CalculateNext(string pattern, ref int[] next)    {        next[0] = 0;        for (int i = 1, k = 0; i < pattern.Length; ++i)        {            while(pattern[i] != pattern[k])            {                if (k > 0)                    k = next[k - 1];//這個有點難理解,因為她是匹配失敗後(p[i]!=p[k]),                                    //直接使用匹配成功部分的共同前尾碼接著進行匹配p[i]和p[新k],此時因為新k=next[k-1],所以p[x~i]=p[0-新k]                else                {                    k = -1;//得不到前面next的協助了,需要置k=0,並且需要跳出while                    break;                }            }            k++;            next[i] = k;        }    }    void KMP(string inStr, string pattern, int[] next)    {        for (int i = 0, k = 0; i < inStr.Length; i++)        {            if (pattern[k] == inStr[i])            {                k++;                if (k == pattern.Length)                {                    break;                }            }            else            {                if (k != 0)//k=0特殊處理,直接移動i即可,k依然是0                {                    k = next[k-1];//一開始我是用1文的說法(移動位元 = 已匹配的字元數 - 對應的部分匹配值):pattern右移d=k-next[k-1],即k需回退x才能維持和i對應(分別對著兩字串的下一個比較字元),x=k-d=next[k-1]
                    //即,k=next[k-1],所以理解為:k應該重設到最長共同前尾碼的下一個位置,這樣比1文的說法容易理解些(因為next裡是長度,k是下標,所以剛好next[k-1]就是最長共同前尾碼的下一個位置的下標) } } } }

 

KMP演算法學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.