定長順序儲存表示
用一組連續的儲存單元儲存串值的字串行。在串的定長順序儲存結構中,為每個串變數分配乙個固定長度的儲存區,即定長陣列。
串長有兩種表示方式:用乙個額外的變數len來存放串的長度,再有就是在串值後面加乙個不計入串長的結束標記字元「\0」,此時的串長值為隱藏值。
為了不發生截斷,則在使用時不限定串的最大長度,採用動態分配的方式。
堆分配儲存方式
仍然以一組位址連續的儲存單元存放在串值的字串行,但他們的儲存空間是在執行過程中動態分配得到的。
利用malloc()函式和free()函式來開空間和釋放空間,開成功後會返回乙個指向起始位址的指標,作為串的基位址。
塊鏈儲存
串的鏈式儲存結構和線性表的串的鏈式儲存結構類似,採用單鏈表來儲存串,結點的構成是:
data域:存放字元,data域可存放的字元個數稱為結點的大小;
next域:存放指向下一結點的指標。
若每個結點僅存放乙個字元,則結點的指標域就非常多,造成系統空間浪費,為節省儲存空間,考慮串結構的特殊性,使每個結點存放若干個字元,這種結構稱為塊鏈結構。
子串的定位操作稱為串的模式匹配。
樸素的模式匹配(bf演算法)
(1)基本思想是窮舉法,即就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元;若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配結果。
(2)bf的基本思想是:從主串s=「s(0) s1 …s(n-1)」的第pos個字元開始與子串t=「t(0) t1 …t(n-1)」的第乙個字元比較,如果相等則繼續比較後乙個字元;否則從主串的下一字元開始與子串t的第乙個字元重新開始比較,以此類推。如果在主串s中存在與子串t相等的連續字串行,則匹配成功,函式返回子串t中第乙個字元在主串s中的位置;否則,函式返回-1。簡單的說,就是對主串的每乙個字元作為子串的開頭,與要匹配的字串進行匹配。對主串做大迴圈,每個字元開頭做t的長度的小迴圈,直到匹配成功或全部遍歷完成為止。
(3)假設我們要從主串s=「goodgoogle」中,找到t=「google」這個子串的位置。步驟如下:
若模式子串的長度是m,目標穿的長度是n,這時最壞的情況是每遍比較都在最後出現不等,即每遍最多比較m次,最多比較n-m+1遍,總的比較次數最多為m(n-m+1),因此樸素的模式匹配演算法的時間複雜度為o(mn)。樸素的模式匹配演算法中存在回溯,這影響到匹配演算法的效率,因而樸素的模式匹配演算法在實際應用中很少採用。在實際應用主要採用無回溯的匹配演算法,kmp演算法為無回溯的匹配演算法。
kmp演算法
(1)kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度o(m+n)。
(2)字串的字首字尾:將乙個字串在任意位置分開,得到的左邊部分即為字首,右邊部分即為字尾。例如對於字串"abcd",它的字首有"a",「ab」,「abc」;字尾有"d",「cd」,「bcd」。注意前字尾均不包括字串本身。
(3)最長公共前字尾:對於乙個字串來說,它既有字首,又有字尾,所謂的最長公共前字尾,即該字串最長的相等的字首和字尾。例如上面的字串"abcd"就沒有公共前字尾,更別提最長了,因為它的前字尾裡就沒有相等的;而字串"abcab"就有乙個最長的公共前字尾即"ab"。
其他的看這篇部落格,大神講的很明白,上面的有部分也是看著這篇寫的,點讚!!資料結構 串的模式匹配演算法bf、kmp
2020資料結構 查詢之雜湊表
線性表和樹表的查詢中,記錄在表中的位置與記錄的關鍵字之間不存在確定的關係,因此,在這些表中查詢記錄時需要一些關鍵字比較。這類查詢建立在 比較 的基礎上,查詢的效率取決於比較的次數。同義詞 上述發生碰撞的不同關鍵字。在構造雜湊函式時,必須注意以下幾點 雜湊函式的定義域必須包含全部的需要儲存的關鍵字,而...
2020資料結構 查詢之順序查詢和折半查詢
1.順序查詢 1.1 一般線性表的順序查詢 演算法分析 對於有n個元素的表,給定的key值與表中第i個元素的關鍵字相等,需要進行n i 1次關鍵字比較,查詢成功時,順序查詢的平均長度為 求和pi n i 1 順序查詢不成功的平均長度為n 1。優缺點缺點 n較大時,平均查詢長度長,效率低 優點 對資料...
資料結構之查詢
date 08 07 11 descript 折半查詢,插入跟刪除演算法 public class binaryinsertex extends seqlist public binaryinsertex int n public void create catch exception ex pub...