第四章 陣列和字串

2021-10-01 04:39:11 字數 3357 閱讀 7475

一、字串

串:零個或多個字元組成的有限序列。 串長度:串中所包含的字元個數。 空串:長度為0的串,記為:" "。

非空串通常記為: s=" s1 s2 …… sn " 其中:s是串名,雙引號是定界符,雙引號引起來的部分是串值 ,si(1≤i≤n)是乙個任意字元。

子串:串中任意個連續的字元組成的子串行。 主串:包含子串的串。 子串的位置:子串的第乙個字元在主串中的序號。

串的儲存結構:

(一)順序串:用陣列來儲存串中的字串行。

1.表示串的長度的三種方法:

方案1:用乙個變數來表示串的實際長度。

方案2:在串尾儲存乙個不會在串**現的特殊字元作為串的終結符,表示串的結尾。

方案3:用陣列的0號單元存放串的長度,從1號單元開始存放串值。

二、模式匹配:

給定主串s="s1s2…sn"和模式t="t1t2…tm", 在s中尋找t 的過程稱為模式匹配。

如果匹配成功,返回t 在s中的位置,如果匹配失敗,返回-1。

(假設串採用順序儲存結構,串值從0號單元開始存放。)

1.模式匹配——bf(brute-force)演算法

基本思想: 從主串s的第0個字元開始和模式t 的第0個字元進行比較,     若相等,則繼續比較兩者的後續字元;     否則,從主串s的第1個字元開始和模式t 的第0個字元進行比較,     重複上述過程,直到t 中的字元全部比較完畢,則說明本趟匹配成功;或s中字元全部比較完,則說明匹配失敗。

說明:模式匹配過程要進行多趟的匹配,每趟匹配要進行若干次的比較。

偽**:

1. 在串s和串t中設比較的起始下標i和j;

2. 迴圈直到s或t的所有字元均比較完;    

2.1 如果s[i]==t[j],繼續比較s和t的下乙個字元;    

2.2 否則,將i和j回溯(i=i-j+1,j=0),準備下一趟比較;

3. 如果t中所有字元均比較完,則匹配成功,返回匹配的起始比較下標(i-j);否則,匹配失敗,返回-1;

int bf(char s[ ], char t[ ])

設串s長度為n,串t長度為m,在匹配成功的情況下,考慮兩種極端情況:

⑴ 最好情況:不成功的匹配都發生在串t的第乙個字元。

在i-1趟不成功的匹配中共比較了i-1次, 第i趟成功的匹配共比較了m次, 所以總共比較了i-1+m次.所有匹配成功的可能情況共有n-m+1種。

(2)最壞情況:不成功的匹配都發生在串t的最後乙個字元。

設匹配成功發生在si處,則在這次成功的比較過程中共進行了多少次比較?(包括之前失敗的比較) 在i-1趟不成功的匹配中比較了(i-1)×m次, 第i趟成功的匹配共比較了m次, 所以總共比較了i×m次。

所有匹配成功的可能情況共有n-m+1種。

bf效能低的原因:在每趟匹配不成功時存在大量回溯,沒有利用已經部分匹配的結果。

2.模式匹配——kmp(knuth-morris-pratt)演算法

i可以不回溯,模式向右滑動到的新比較起點k ,並且k 僅與模式串t有關!

三、多維陣列

將線性表中的元素進行擴充——>多維陣列。

(多維)陣列——線性表中的資料元素可以是線性表,但所有元素的型別相同。

廣義表——線性表中的資料元素可以是線性表,且元素的型別可以不相同。

(一)、

1.陣列:陣列是由一組型別相同的資料元素構成的有序集合,每個元素受n(n≥1)個線性關係的約束,並稱該陣列為 n 維陣列。

(1)陣列的特點:元素本身可以具有某種結構,屬於同一資料型別; 陣列是乙個具有固定格式和數量的資料集合。

二維陣列是資料元素為線性表的線性表

(2)陣列的基本操作:

a.訪問:給定一組下標,讀出對應的陣列元素;

b.修改:給定一組下標,儲存或修改與其相對應的陣列元素。

訪問和修改操作本質上只對應一種操作——定址

(3)儲存方式

陣列沒有插入和刪除操作,所以,不用預留空間,適合採用順序儲存。

陣列的儲存結構與定址——二維陣列:

常用的對映方法有兩種:

按行優先:先行後列,先儲存行號較小的元素,行號相同者先儲存列號較小的元素。

按列優先:先列後行,先儲存列號較小的元素,列號相同者先儲存行號較小的元素。

四、矩陣的壓縮儲存

特殊矩陣和稀疏矩陣:

特殊矩陣:矩陣中很多值相同的元素並且它們的分布有一定的規律。 稀疏矩陣:矩陣中有很多零元素。

壓縮儲存的基本思想是: ⑴ 為多個值相同的元素只分配乙個儲存空間; ⑵ 對零元素不分配儲存空間。

1.特殊矩陣的壓縮儲存——對稱矩陣  :對稱矩陣的特點:對稱矩陣特點:aij=aji

2.特殊矩陣的壓縮儲存——三角矩陣

(1)下三角矩陣的壓縮儲存:

儲存下三角元素、對角線上方的常數只存乙個。

(2)上三角矩陣的壓縮儲存:

儲存上三角元素、對角線下方的常數只存乙個。

3.特殊矩陣的壓縮儲存——對角矩陣 (帶狀矩陣)

對角矩陣:所有非零元素都集中在以主對角線為中心的帶狀區域中,除了主對角線和它的上下方若干條對角線的元素外,所有其他元素都為零。

4.十字鍊錶結點類的定義

templateclass olnode

;};

五、廣義表

廣義表(列表):  n (  0 )個表元素組成的有限序列,記作: ls = (a0, a1, a2, …, an-1)     ls是表名,ai是表元素,它可以是表 (稱為子表),可以是資料元素(稱為原子)。   n為表的長度。n = 0 的廣義表為空表。

長度:廣義表ls中的直接元素的個數; 深度:廣義表ls中括號的最大巢狀層數。 表頭:廣義表ls非空時,稱第乙個元素為ls的表頭; 表尾:廣義表ls中除表頭外其餘元素組成的廣義表。

廣義表與線性表的區別:

線性表的成分都是結構上不可分的單元素;廣義表的成分可以是單元素,也可以是有結構的表;線性表是一種特殊的廣義表;廣義表不一定是線性表,也不一定是線性結構。

廣義表的基本運算:

(1)求表頭gethead(l):非空廣義表的第乙個元素,可以是乙個單元素,也可以是乙個子表

(2)求表尾gettail(l):非空廣義表除去表頭元素以外其它元素所構成的表。表尾一定是乙個表

廣義表的儲存結構——頭尾表示法

定義結點結構:

enum elemtag ; 

template struct glnode ptr;

};};

廣義表的特點:

1)有次序性:乙個直接前驅和乙個直接後繼

有長度:=表中元素個數

有深度:=表中括號的重數

可遞迴:自己可以作為自己的子表

可共享:可以為其他廣義表所共享

第四章 字串和多維陣列

4.1字串的定義 1.串 零個或多個字元組成的有限序列 串 零個或多個字元組成的有限序列。串長度 串中所包含的字元個數。空串 長度為0的串,記為 非空串通常記為 s s1 s2 sn 其中 s是串名,雙引號是定界符,雙引號引起來的部分是串值 si 1 i n 是乙個任意字元。1.1串的邏輯結構 子串...

第四章 字串 和多維陣列

4.1 字串 4.1.1 字串的定義 1 字串的定義 字串 是零個或者多個字元陣列的有限序列。空格傳 只包含空格的串。串中所包含的字元個數稱為串的長度,長度為0的串稱為空串。子串 字串中任意個連續的字元組成的子串行。2 字串的比較 通過組成串的字元之間的比較實現。4.1.2 字串的儲存結構 字串是資...

第四章字串和多維陣列

4.1字串的定義 1.串 零個或多個字元組成的有限序列 串 零個或多個字元組成的有限序列。串長度 串中所包含的字元個數。空串 長度為0的串,記為 非空串通常記為 s s1 s2 sn 其中 s是串名,雙引號是定界符,雙引號引起來的部分是串值 si 1 i n 是乙個任意字元。1.1串的邏輯結構 子串...