大話數據結構(五)串(樸素的模式匹配算法、KMP模式匹配算法)

是由零個或多個字符組成的有限序列,又名叫字符串

1 串的比較

給定兩個串,s=a1a2.....ant=b1b2....bms =''a_1a_2.....a_n'',t=''b_1b_2....b_m'',當滿足以下條件之一時,s<ts<t

  • n<mn<m,且ai=bii=1,2,.....,na_i = b_i(i=1,2,.....,n)。例如,s=hapt=happys=''hap'',t=''happy'',就有s<ts<t
  • 存在某個k<=min(m,n)k<=min(m,n),使得ai=bii=1,2,.....,k1a_i = b_i(i=1,2,.....,k-1),ak<bka_k < b_k。例如,s=happent=happys=''happen'',t=''happy'',因爲兩串前4個字母均相同,而兩串第5個字母(kk值), ee 的ASCII碼是101,而yy 的ASCII碼是121,顯然 e<ye < y,所以s<ts<t

2 串的抽象數據類型

串的邏輯結構與線性表相似,不同之處在於串針對的是字符集,每個元素都是字符。此外,串的基本操作與線性表有很大差別。線性表關注的是單個元素的操作,串中更多則是查找子串位置、得到指定位置子串、替換子串等操作。
在這裏插入圖片描述

3串的存儲結構

3.1 串的順序存儲結構

用一組地址連續的存儲單元來存儲串中的字符序列。一般用定長數組爲每個定義的串變量分配一個固定長度的存儲區。這樣的存儲方式存在問題,因爲定長,在字符串操作時候,比如連接、插入新串、替換等操作時,都可能使串序列的長度超過了數組的長度MaxSize。

3.2 串的鏈式存儲結構

與線性表相似,但因爲串中每個元素都是一個字符,如果用鏈表存儲串值,一個結點對應一個字符,就會存在很大的空間浪費。因此,一個結點可以存放一個字符,可以考慮存放多個字符,最後一個結點若是未被佔滿,可用“#”或其他非串值字符補全,如圖。
在這裏插入圖片描述
當然,一個結點存多少個字符才合適顯得很重要,這會影響串處理的效率,要根據實際情況取捨。總的來說,串的鏈式存儲結構除了在連接串與串操作時有一定方便之外,不如順序存儲靈活,性能也不如順序存儲結構好

4 樸素的模式匹配算法

5 KMP模式匹配算法

6 KMP改進

以下內容移步本博客其他文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章