王道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數組:
| 模式 | a | b | a | a | b | c | a | b | a |
| next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 | 3 |
KMP算法執行
整體上與簡單匹配算法類似
當匹配過程產生失配時,指向主串的指針i不變,指向模式串的指針j退回到next[j]的位置并重新進行比較;
當j為0時,i與j同時加1;
若主串的第i個位置和模式串的第一個字符不等,從主串的第i+1個位置開始匹配。
代碼如下
KMP算法的時間復雜度為O(m+n)O(m+n)O(m+n),而一般情形下普通模式匹配算法實際執行時間近似也為O(m+n)O(m+n)O(m+n),因此至今仍被采用。KMP僅在主串與模式串有很多部分匹配時才顯得比普通算法快得多,其主要優點是主串不回溯。
KMP算法優化
總結
以上是生活随笔為你收集整理的王道408数据结构——第四章 串(KMP算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王道408数据结构——第三章 栈和队列
- 下一篇: 王道408数据结构——第五章 树与二叉树