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