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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

王道408数据结构——第四章 串(KMP算法)

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 王道408数据结构——第四章 串(KMP算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、串的定義和實現

字符串簡稱串,是由零個或多個字符組成的有限序列,一般記為S=′a1a2???an′S='a_1a_2···a_n'S=a1?a2????an?,n稱為串的長度。
串中任意多個連續字符組成的子序列稱為該串的子串,相應的該串稱為主串。某個字符在串中的序號稱為字符在串中的位置,子串在串中的位置已子串的第一個字符的位置表示。
兩個串相等的充分必要條件是:兩個串長度相等,且各個位置對應字符相等

在王道教材中,串的下標從1開始

串的儲存表示

1. 定長順序儲存表示

類似于線性表的順序存儲結構,用一組地址連續的存儲單元儲存串值的字符序列。為每個串,變量分配一個固定長度的儲存區,即定長數組。
串的實際長度不能超過MAXSIZE,超過定長的串值會被舍去,稱為截斷(要客服這種弊端,只能采用動態分配的方法,不限定最大長度)。串的實際長度有兩種表達方式:一種是用一個額外的變量存放串的長度;二是在串值后加一個不計入串長的結束標記符號“\0”,此時串長為隱含值。

2. 堆分配儲存表示

堆分配儲存表示仍然以一組地址連續的存儲單元存放串值的字符序列,但他們的存儲空間實在程序執行時動態分配的(從一個稱為“堆”的自由儲存區獲取)。

二、模式匹配

求子串(模式串)在主串中的位置。
簡單模式匹配算法最壞時間復雜度為O(mn),m和n非別為模式串和主串的長度。
簡單模式匹配算法可以改進為KMP算法。

next數組

next[j]的取值為該字符前一個元素的部分匹配值+1,即最長相同前后綴長度+1,同時規定next[1]=0。
例如對于以下模式串,有next數組:

j123456789
模式abaabcaba
next[j]011223123

KMP算法執行

整體上與簡單匹配算法類似
當匹配過程產生失配時,指向主串的指針i不變,指向模式串的指針j退回到next[j]的位置并重新進行比較;
當j為0時,i與j同時加1;
若主串的第i個位置和模式串的第一個字符不等,從主串的第i+1個位置開始匹配。
代碼如下

int indexKMP(String S, String T, int next[]){ // 主串,模式串,next數組int i = 1, j = 1;while(i <= S.length && j <= T.length){if(j==0 || S.ch[i] == T.ch[j]){ // j等于0或未適配,兩指針均向后移動i++;j++;}else{ // 指針失配且j不等于0,i不移動,j移動到next[j]處j = next[j];}if(j > T.length)return i - T.length; // 匹配成功else return 0; }

KMP算法的時間復雜度為O(m+n)O(m+n)O(m+n),而一般情形下普通模式匹配算法實際執行時間近似也為O(m+n)O(m+n)O(m+n),因此至今仍被采用。KMP僅在主串與模式串有很多部分匹配時才顯得比普通算法快得多,其主要優點是主串不回溯。

KMP算法優化

總結

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

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