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.串的順...