資料結構學習筆記 第4章 串

2021-10-07 16:15:37 字數 1970 閱讀 8785

4.1.3 串的基本操作

4.2 串的模式匹配

4.2.3 kmp演算法的進一步優化

定長順序儲存表示

#define maxlen 255             

//預定義最大串長為255

typedef

struct

sstring;

堆分配儲存表示
typedef

struct

hstring;

塊鏈儲存表示
int

index

(string s, string t)

return0;

//s中不存在與t相等的子串

}

int

index

(sstring s, sstring t)

else}if

(j > t.length)

//匹配成功

return i - t.length;

else

//匹配失敗

return0;

}

字串的字首、字尾和部分匹配值

故字串 『abcac』 的的部分匹配值為 0 0 0 1 0。將部分匹配值寫成陣列形式,就得到了部分匹配值(partial match,pm)的表 編號

1234

5sab

cacpm

0001

0因為 2 - 0 = 2,所以將子串向後移動2位,如下進行第二趟匹配:

第二趟匹配過程:

4 - 1 = 3,將子串向後移動3位,如下進行第三趟匹配:

第三趟匹配過程:

整個匹配過程中,主串始終沒有回退,故kmp演算法可以在o(n+m)的時間數量級上完成串的模式匹配操作,大大提高了匹配效率

kmp演算法的原理是什麼?

編號123

45sa

bcac

pm-100

01這樣,上式就改寫為 mov

e=(j

−1)−

next

[j

]move = (j - 1) - next[j]

move=(

j−1)

−nex

t[j]

相當於將子串的比較指標 j 回退到 j=j

−mov

e=ne

xt[j

]+

1j = j - move = next[j] + 1

j=j−mo

ve=n

ext[

j]+1

有時為了使公式更加簡潔、計算簡單,將 next 陣列整體+1。因此上述子串的next陣列也可以寫成 編號

1234

5sab

cacpm

0111

2

void

get_next

(string t,

int next)

else

j = next[j]

;//否則令j = next[j],迴圈繼續

}}

int

indecx_kmp

(string s, string t,

int next)

else

j = next[j]

;//模式串向右移動}if

(j > t.length)

return i - t.length;

//匹配成功

else

return0;

}

void

get_nextval

(string t,

int nextval)

else

j = nextval[j];}

}

《資料結構》學習筆記 第4章 棧與佇列

第四章 棧與佇列 1,棧 線性序列,由向量 列表派生 相比於向量和列表,增加了約束 只能訪問棧頂元素 只能對棧頂元素增減,且lilo。五個主要操作 push pop top empty size 實現 棧的應用 遞迴巢狀,如 延遲緩衝,如中綴表示式求值 棧式計算 2,佇列 在圖演算法中有廣泛應用 受...

《資料結構》學習筆記(4)

include using namespace std c 中有兩種函式 常規函式和成員函式 定義都包括四個部分 函式名,形式參數列,返回型別和函式體。引數傳遞的兩種方式 傳值 預設的引數傳遞方式 引用型別。使用引用方式將大大節省傳遞引數時間,並可節省儲存引數物件的副本空間。int squareby...

資料結構學習筆記(串)

串的定義 1.串 串是由零個或多個字元組成的有限序列,又名叫字串。2.串的比較 串的長度以及它們各個對應位置的字元都相等時,才算相等。給定兩個串 s a1a2.an t b1b2 bm 當滿足以下條件之一時,s 3.串中更多的是查詢字串位置 得到指定位置字串 替換子串等操作。串的儲存結構 1.串的順...