資料結構5

2021-09-02 01:16:56 字數 4547 閱讀 5243

第四章 字串和多維陣列

4.1 字串

4.1.1 字串的定義

★字串的定義

串:零個或多個字元組成的有限序列。

串長度:串中所包含的字元個數。

空串:長度為0的串,記為:" "。

非空串通常記為: s=" s1 s2 …… sn "

其中:s是串名,雙引號是定界符,雙引號引起來的部分是串值 ,si(1≤i≤n)是乙個任意字元。

子串:串中任意個連續的字元組成的子串行。

主串:包含子串的串。

子串的位置:子串的第乙個字元在主串中的序號。

例:求" world"的子串。

共16個:" ";

" world",

" worl"," orld";

" wor","orl "," rld";

" wo"," or"," rl","ld ";

" w"," o","r ","l "," d"。

★字串的比較

串的比較:通過組成串的字元之間的比較來進行的。

給定兩個串:x="x1x2…xn"和y=「y1y2…ym」,則:

當n=m且x1=y1,…,xn=ym時,稱x=y;

當下列條件之一成立時,稱x<y:

⑴ n<m且xi=yi(1≤ i≤n);

⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。

(按字典比較)

4.1.2 字串的儲存結構

表示串的長度:

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

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

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

4.1.3 模式匹配

■模式匹配:

給定主串s="s1s2…sn"和模式t=「t1t2…tm」,在s中尋找t 的過程稱為模式匹配。如果匹配成功,返回t 在s中的位置;如果匹配失敗,返回0。

■樸素的模式匹配演算法:

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

偽**:

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

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

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

2.2 否則,將i和j回溯,準備下一趟比較;

如果t中所有字元均比較完,則匹配成功,返回匹配的起始比較下標;否則,匹配失敗,返回0;

樸素的模式匹配演算法bf:

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

i=0; j=0;   

while (s[i]!='\0'&&t[j]!='\0')

else

} if (t[j]=='\0') return (i-j+1);

else return 0;

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

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

設匹配成功發生在si處,則在i-1趟不成功的匹配中共比較了i-1次,第i趟成功的匹配共比較了m次,所以總共比較了i-1+m次,所有匹配成功的可能情況共有n-m+1種,則:(即共比較了i趟,前i-1趟均只比較了1次,而第i趟比較了m次)。所以,最好情況下的時間複雜度為:o(n+m).

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

設匹配成功發生在si處,則在i-1趟不成功的匹配中共比較了(i-1)×m次,第i趟成功的匹配共比較了m次,所以總共比較了i×m次。所以,最壞情況下的時間複雜度為o(n*m).

■kmp演算法:

基本思想:主串不進行回溯

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

抓住部分匹配時的兩個特徵:設模式滑動到第 k 個字元

(1)則t[0]~t[k-1] = s[i-k]~s[i-1]

(2)則t[j-k]~t[j-1] = s[i-k]~s[i-1]

兩式聯立可得:t[0]~t[k-1] = t[j-k]~t[j-1]

計算next[j](t[i]對應的k值,0<=j<=m)的方法:

(1)當j=0時,next[j]=-1;

next[j]=-1表示不進行字元比較

(2)當j>0時,next[j]的值為:模式串的位置從0到j-1構成的串中所出現的首尾相同的子串的最大長度。

(3)當無首尾相同的子串時next[j]的值為0。

next[j]=0表示從模式串頭部開始進行字元比較

kmp演算法的偽**描述:

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

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

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

2.2 將j向右滑動到next[j]位置,即j=next[j];

2.3 如果j=-1,則將i和j分別加1,準備下一趟比較;

如果t中所有字元均比較完畢,則返回匹配的起始下標;否則返回0;

4.2 多維陣列

4.2.1 陣列的定義

▲陣列是由一組型別相同的資料元素構成的有序集合,每個資料元素稱為乙個陣列元素(簡稱為元素),每個元素受n(n≥1)個線性關係的約束,每個元素在n個線性關係中的序號i1、i2、…、in稱為該元素的下標,並稱該陣列為 n 維陣列。

▲陣列的特點:

(1)元素本身可以具有某種結構,屬於同一資料型別;

(2)陣列是乙個具有固定格式和數量的資料集合。

▲例:元素a22受兩個線性關係的約束,在行上有乙個行前驅a21和乙個行後繼a23,在列上有乙個列前驅a12和和乙個列後繼a32。

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

▲陣列的基本操作:

⑴ 讀操作:給定一組下標,讀出對應的陣列元素;

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

這兩種操作本質上只對應一種操作——定址,即根據一組下標定位相應的陣列元素。

4.2.2 陣列的儲存結構與定址

●二維陣列常用的對映方法有兩種:

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

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

按行優先aij在一維陣列中的下標為:(i-1)*n+(j-1)。

4.3 矩陣的壓縮儲存

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

稀疏矩陣:矩陣中有很多零元素。

壓縮儲存的基本思想是:

⑴ 為多個值相同的元素只分配乙個儲存空間;

⑵ 對零元素不分配儲存空間。

4.3.1 對稱矩陣的壓縮儲存

◆對稱矩陣的特點:

在乙個n階方陣中,有aij=aji(1<=i,j<=n)。

◆對於下三角中的元素aij(i≥j),在陣列sa中的下標k與i、j的關係為:k=i×(i-1)/2+j -1。

上三角中的元素aij(i<j),因為aij=aji,則訪問和它對應的元素aji即可,即:k=j×(j-1)/2+i -1 。

4.3.2 三角矩陣的壓縮儲存

只儲存上三角(或下三角)部分的元素。

◆下三角矩陣中任一元素aij在陣列sa中的下標k與i、j的關係為:當i>=j時,k=i×(i-1)/2+j -1;當i◆上三角矩陣中任一元素aij在陣列sa中的下標k與i、j的關係為:當i>=j時,k=(2n-i+2)×(i-1)/2+j -i;當i4.3.3 對角矩陣的壓縮儲存

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

◆對於乙個m*n的w對角矩陣(w是占有非0元素的對角線的個數,也稱頻寬),壓縮方法有:

(1)將其壓縮到乙個m行w列的二維陣列b中

(2)將對角矩陣壓縮儲存到一維陣列c中,按行儲存其非0元素。

4.3.4 稀疏矩陣的壓縮儲存

◆稀疏矩陣中的非零元素的分布沒有規律。

◆將稀疏矩陣中的每個非零元素表示為:

(行號,列號,非零元素值)——三元組

◆定義三元組:

emplate

struct element

int row, col;                   //行號,列號

datatype item //非零元素值

◆三元組表:將稀疏矩陣的非零元素對應的三元組所構成的集合,按行優先的順序排列成乙個線性表。

(1)三元組順序表

其儲存結構定義:

const int maxterm=100;

template struct sparsematrix

;

(2)十字鍊錶

採用鏈結儲存結構儲存三元組表,每個非零元素對應的三元組儲存為乙個鍊錶結點。

row:儲存非零元素的行號;

col:儲存非零元素的列號;

item:儲存非零元素的值;

《資料結構》實驗5

1.回樹和二叉樹的邏輯結構和儲存方法,清楚掌握樹和二叉樹的遍歷操作。2.學習樹的相關知識來解決實際問題。3.進一步鞏固程式除錯方法。4.進一步鞏固模板程式設計。實驗內容 1.自己設計乙個二叉樹,深度最少為4,請遞迴演算法分別用前序 中序 後序遍歷輸出樹結點。1.標頭檔案 bitree.h ifnde...

資料結構 陣列(5)

1 數字在排序陣列中出現的次數 劍指offer 38 題目 統計乙個數字在排序陣列中出現的次數。例如輸入排序陣列和數字3,由於3在這個陣列中出現了4次,因此輸出4.思路 用二分查詢,分別找出第乙個3,和最後乙個3的位置,然後計算個數。public static int getlower int ar...

資料結構筆記(5)

串與多維陣列 1.串 實現字串 void initstr str str 初始化字串 int strassign str str,char ch 賦值 void printstring str str 輸出字串 int strlength str str 求字串長度 int strcompare s...