第四章字串和多維陣列
4.1
字串
4.1.1
字串的定義
1.字串的定義
字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為
0的串為空串,記作「」,乙個非空串通常該記作:s=「
s1,s2…sn」
字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串,子串的第乙個字元在主串的序號成為子串在主串的位置。
2.字串的比較
當下列條件之一成立時,稱
x>y。
n,且x11
,(i=1,2…,n);
存在某個
k≤min(m,n)
,使得xi=yi,(i=1,2,…,k-1),xk
k。
4.1.3
模式匹配
給定兩個字元s=「
s1,s2…sn
」和t=「t1
,t2…tn
」,在主串
s中尋找子串
t的過程稱為模式匹配,
t成為模式。如何匹配成功,返回t在
s中的位置
;如果匹配失敗,返回0.
樸素的模式匹配演算法
樸素的模式匹配演算法
bf intbf(char s,char t)
else
} if(t[j]=='\0')return (i-j+1);
else return 0; }
改進的模式匹配演算法
bf演算法簡單但效率較低,一種對
bf演算法做了很大改進的模式匹配演算法是
kmp演算法,其基本思想是主串不進行回溯。
由t[0]~t[k-1]=s[i-k]~s[i-1]
和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[j]
對應的k值(0
≤j其定義如下:
-1j=0
next[j]=max
0 其他情況
kmp演算法的時間複雜度是
o(n+m)
。kmp
演算法和bf
演算法相比,增加了很大難度,我們主要學習該演算法的設計技巧。
4.2
多維陣列
4.2.1
陣列的定義
陣列是由型別相同的資料元素構成的有序集合,每個資料元素稱為乙個陣列元素,每個元素受n(
n≥1)個線性關係的約束,每個元素在
n個線性關係中的序號
i1,i2,…,in
稱為該元素的下標,並稱該陣列為
n維陣列。
陣列是乙個具有固定格式和數量的資料集合,在陣列中一般不能執行插入或刪除某個陣列元素的操作。因此,除了初始化和銷毀之外,在陣列中通常只有兩種操作。
讀操作:給定一組下標,讀取相應的陣列元素。
寫操作:給定一組下標,儲存或修改相應的陣列元素。
4.2.2
陣列的儲存結構與存址
由於陣列一般不執行插入和刪除操作,也就是說,一旦建立了陣列,其元素個數和元素之間的關係就不再發生變動,而且,陣列是一種特殊的資料結構,一般要求能夠隨機訪問,因此,資料採用順序儲存結構。由於記憶體單元是一維結構,而多維陣列是多維結構,所以,採用順序儲存結構儲存陣列首先需要將多維結構對映到一維結構。
二維陣列的每個元素含有兩個下標,需將二維關係對映為一維關係。常用的對映方法有兩種:以行序為主序和以列序為主序。
按行優先儲存的基本思想是:先行後列,先儲存行號較小的元素,行號相同者先儲存列號較小的元素。
按列優先儲存的基本思想是:先列後行,先儲存列號較小的元素,列號相同者先儲存行號較小的元素。任一元素儲存位址的計算與按行優先儲存類似。
按行優先儲存的基本思想是:最右邊的下標先變化,即最右下表從小到大,迴圈一遍後,右邊第二個下標再變,……最後是最左下標。
按列優先儲存的基本思想恰好相反
:最左邊的下標先變化,即最左下標從小到大,迴圈一遍後,左邊第二個下標再變,……最後是最右下標。
4.3矩陣的壓縮儲存
矩陣是很多科學與工程計算問題中的處理物件。在實際應用中,經常出現一些階數很高的矩陣,同時在矩陣中有很多值相同的元素並且他們的分布有一定的規律——稱為特殊矩陣,或者矩陣中與很多零元素——稱為稀疏矩陣。
壓縮儲存的基本思想是:
1 為多個值相同的元素只分配乙個儲存空間;對零元素不分配儲存空間。
4.3.1
對稱矩陣的壓縮儲存
對稱矩陣關於主對角線對稱,因此只需儲存下三角部分即可。這樣,原來需要
n*n個儲存單元,現在只需n*(
n+1)
/2個儲存單元,節約了大約一半的儲存單元。當
n較大時,這是客觀的一部分儲存單元。
4.3.2
三角矩陣的壓縮儲存
下三角矩陣的壓縮儲存與對稱矩陣類似,不同之處僅在於儲存下三角中的元素以外,還要儲存對角線上方的常數。因為是同乙個常數,所以只儲存乙個即可。這樣,共儲存
n*(n+1)/2+1
個元素,將其按行優先存入陣列
sa[n*(n+1)/2+1]
中。下三角矩陣中任一元素
a(ij)在sa
中的下標k與
i、j的對應關係為:
當i>=j
時,k=i*(i-1)/2+j-1;
當i時,
k=n*(n+1)2
; 同理,上三角矩陣中任一元素
a(ij)在sa
中的下標k與
i、j對應關係為:
當i<=j
時,k=(i-1)*(2n-i+2)/2+j-i;
當i>j
時,k=n*(n+1)/2
4.3.3
對角矩陣的壓縮儲存
在對角矩陣中,所有非零元素都集中在以主對角線為中心的帶狀區域,除了主對角線和他的上下若干條主對角線的元素外,所有其他元素都為零。因此,對角矩陣也稱為帶狀矩陣。
對於乙個
m*n的
w對角矩陣(
w是占有非零元素的對角線的個數,也稱頻寬),一種壓縮方法是將其壓縮到乙個m行
w列的二維陣列
b中,則
a(ij)
對映為b(ts)
,其對映關係為:
t=is=j-i+2
4.3.4
稀疏矩陣的壓縮儲存
將稀疏矩陣的非零元素對應的三元組成所構成的集合,按行優先的順序排列成乙個線性表,稱為三元組表,則稀疏矩陣的壓縮儲存轉化為三元組表的儲存。
三元組順序表
採用順序儲存結構儲存的三元組表稱為三元組順序表。顯然,要唯一表示乙個稀疏矩陣,還需要在儲存三元表的同時儲存該矩陣的行數、列數和非零元素的個數,其儲存結構定義如下:
constint maxterm=100;
structsparsematrix ;
十字鍊錶
稀疏矩陣的鏈結儲存結構稱為十字鍊錶。它具備儲存結構的特點,因此,在非零元素的個數及位置都會發生變化的情況下,通常採用十字鍊錶儲存稀疏矩陣。
十字鍊錶儲存稀疏矩陣的基本思想是:將每個非零元素對應的三元組儲存為乙個鏈結表結點,節點由
5個域組成。
其中,element
為資料域,儲存非零元素對應的三元組;
right
為指標域,指向同一行中的下乙個三元組;
down
為指標域,指向同一列中的下乙個三元組。
4.4
應用舉例
1. 字串的應用舉例——凱撒密碼
2. 陣列的應用舉例——幻方
資料結構 第四章
第四章 字串和多維陣列 4.1 字串 4.1.1 字串的定義 1.字串的定義 字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為0的串為空串,記作 乙個非空串通常該記作 s s1,s2 sn 字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包...
資料結構 第四章
第四章 字串和多維陣列 4.1 字串 4.1.1 字串的定義 1.字串的定義 字串是零個或多個組成的有限序列,只包含空格的串成為空格串。串中所包含的字元個數成為串的長度,長度為0的串為空串,記作 乙個非空串通常該記作 s s1,s2 sn 字串中任意個連續的字元組成的子串行稱為該串的子串,相應地,包...
資料結構第四章
字串 零個或多個字元組成的有限序列。字串中任意個連續字元組成的子串行稱為該串的子串。子串第乙個字元在主串中的序號稱為子串在主串中的位置。給定兩個字串s和t,在主串s中尋找子串t的過程稱為模式匹配。t稱為模式。bf演算法 int bf char s char t else if t j 0 retur...