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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之串:KMP算法

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之串:KMP算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

串:KMP算法

  • 基本概念:
  • KMP算法原理:
  • KMP算法的代碼實現:
  • KMP算法的性能:

基本概念:

應用優化前提: 有部分匹配的前綴和后綴

KMP算法原理:

按普通的串的模式匹配算法,在1位置比較完之后,中間還有倆次比較才能到達位置2,KMP算法解決的就是如何找到直接找到位置2,繼續進行比較的。

問: 為什么會找到位置2而不是其他位置?
答: 我們發現在模式串的子串(bacba)中存在相同的最長前綴(ba)和最長后綴(ba),那進行串的模式匹配時下一個匹配的位置就是后綴=前綴的位置,即將前綴移動到上一次比較的后綴的位置上在進行比較。
當移動到下一個比較位置時,主串的標志i不需要回退,繼續向后比較即可
模式串的標志j就需要回退到相同前綴的下一個數據元素,回退的位數和部分匹配值相關,若用數組next[]存儲部分匹配值,則有以下公式:

j-1表示上次已經匹配的子串的最后一個元素的位置,next[j-1]表示部分匹配值

問: 如何計算存儲最長匹配值的數組next[]?
答:

前綴等于后綴的最長的串的長度

例:



考研當中上圖的next[]數組并不是最終答案,為實現算法的便利性,考研中的next[]數組會由此數組經過若干次變化得到,變化過程如下:

問: 最終的nextp[]數組如何求得?
答:
1、右移操作,將move中的next[j-1] 變成 next[j]

2、加一操作將j = next[j] + 1變成 j = next[j] (有的教程不加1,具體與代碼實現有關)

問: 如何更加高效的求解next[]數組?
答:

KMP算法的代碼實現:

求next[]數組:

void get_next(String T,int next[]){int i = 1,j = 0;next[1] = 0;while(i < T.length){if(j == 0 || T.ch[i] == T.ch[j]){++i;++j;next[i] = j;}elsej = next[j];} }


kmp算法:

int Index_KMP(String S,String T,int next[],int pos){int i = pos,j = 1;while(i <= S.length && j <= T.length){if(j == 0 || S.ch[i] == T.ch[j]){i ++;j ++; }elsej = next[j];}if(j > T,length)return i - T.length;elsereturn 0; }

KMP算法的性能:

時間復雜度: O(m + n)
空間復雜度: O(1)

總結

以上是生活随笔為你收集整理的数据结构之串:KMP算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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