串的基本操作:
假設有乙個順序串定義如下:
#define maxsize 100
typedef
struct
seqstr;
seqstr* s;
1.串的連線運算:
seqstr*
strcat
(seqstr* s, seqstr* t)
printf
("r = %s\n"
, r->ch)
;return r;
}//最後生成的串r為s+t的結果
2.求子串運算:
seqstr*
substr
(seqstr* s,
int i,
int j)
printf
("t = %s\n"
,t->ch)
;return t;
}
3.子串定位(串的模式匹配):
在串 s 中找出乙個與串 t 相同的子串,一般把串s成為目標,把串 t 成為模式,若在目標 s 中找到模式t則模式匹配成功,找不到則模式匹配失敗。
樸素的模式匹配演算法
int
index
(seqstr* s, seqstr* t)
else}if
(j > t->len)
return
(i - t->len)
;//匹配成功
else
return-1
;//匹配失敗
}
時間複雜度的分析:
1.最好的情況,每次不成功的匹配都發生在 t 的第乙個字元與 s 中的字元的比較時,設從 s 的第 i 個字元開始匹配,成功的概率為 pi,則在之前一共比較了(i-1)次。若在第i趟成功的匹配中匹配了 m 次,則總的比較次數為(i-1+m)次。
∑pi(i-1+m) = [1/(n-m+1)]∑(i-1+m) = 1/2(n+m) ( i 的取值從1 到 n-m+1)
由此,最好情況下演算法的平均時間複雜度為o(n+m)
2.最壞的情況,每一次不成功的匹配都發生在t的最後乙個字元與s中相應字元的比較時,新一趟的起始位置為 i-m+2,若在第i趟匹配成功,則在之前一共匹配了(i-1)趟,每趟m次,再加上第i次的比較,一共比較了(im)次。
∑pi(im) = m/(n-m+1)∑i = (m/(n-m+1)× 1/2 ×(n-m+1)×(n-m+2) = m(n-m+2)/2
由於n>>m,最壞情況下演算法的時間複雜度為o(m×n)
鏈式儲存結構下的模式匹配演算法:
linkstr*
index
(linkstr* s, linkstr* t)
else}if
(er ==
null
)return
(first)
;else
return
null
;}
關於改進的模式匹配演算法
當一趟匹配過程**現字元比較不相等時,不再回溯 i 值,而是利用部分匹配的結果將模式向右移一段距離後,繼續進行比較。
這樣演算法的時間複雜度為o(n+m)。
void
getnext
(seqstr* t,
int next)
else k = next[k];}
return;}
//得到模式串t的值,並存入陣列
intindex
(seqstr* s, seqstr* t)
else j = next[j];}
if(j < t->len)
return
(i - t->len)
;else
return-1
;}
資料結構之串與陣列(C語言,課後習題)
1.假設以帶頭結點的迴圈鍊錶表示佇列,並且只設乙個指標指向隊尾元素結點 注意不設頭指標 試編寫相應的入佇列和出佇列的演算法。void enqueue linklist rear,int x rear是迴圈鍊錶的尾指標,該操作有點類似鍊錶操作中的尾插法建表 int dequeue linklist r...
資料結構之串與陣列
關於串 串是由零個或多個字元組成的有限序列,它的邏輯結構與線性表極為相似,可看作是一種特殊的線性表。串的元素序號從0開始。相關概念 1.串的長度 串中所包含的字元個數 2.空串 長度為0的串 在c語言中,串一般使用不可顯示的字元 0 作為串的結束符。3.子串 串中任意個連續的字元組成的子串行稱為串的...
資料結構 串 C語言
串的概述 串 字串 由n n 0 個字元組成的有限序列。一般記作s s0,s1,s2,sn 1 其中s稱作串名,n稱作串的長度,雙引號括起來的字串行稱作串的值。子串 乙個串中任意個連續的字元組成的子串行。主串 包含子串的串稱為子串的主串。該字元在串中的位置 乙個字元在乙個串中的位置序號 0 串相等 ...