資料結構之串與陣列(C語言)

2021-10-05 09:32:53 字數 2015 閱讀 3835

串的基本操作:

假設有乙個順序串定義如下:

#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 串相等 ...