字串和多維陣列

2021-09-29 03:02:36 字數 3132 閱讀 7350

第四章 字串和多維陣列

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.

1.     樸素的模式匹配演算法

樸素的模式匹配演算法bf

intbf(char s,char t)

i=0;j=0;

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

if(s[i]==t[j])

else

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

else return 0;

2.     改進的模式匹配演算法

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-1  j=0

next[j]=    max {k|1≤k0 其他情況

kmp演算法的時間複雜度是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  對稱矩陣的壓縮儲存

對稱矩陣關於主對角線對稱,因此只需儲存下三角部分即可。這樣,原來需要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同理,上三角矩陣中任一元素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  稀疏矩陣的壓縮儲存

將稀疏矩陣的非零元素對應的三元組成所構成的集合,按行優先的順序排列成乙個線性表,稱為三元組表,則稀疏矩陣的壓縮儲存轉化為三元組表的儲存。

1.       三元組順序表

採用順序儲存結構儲存的三元組表稱為三元組順序表。顯然,要唯一表示乙個稀疏矩陣,還需要在儲存三元表的同時儲存該矩陣的行數、列數和非零元素的個數,其儲存結構定義如下:

const  int maxterm=100;

struct  sparsematrix

elementdata [maxterm];

intmu,nu,tu;

2.       十字鍊錶

稀疏矩陣的鏈結儲存結構稱為十字鍊錶。它具備儲存結構的特點,因此,在非零元素的個數及位置都會發生變化的情況下,通常採用十字鍊錶儲存稀疏矩陣。

其中,element為資料域,儲存非零元素對應的三元組;

right為指標域,指向同一行中的下乙個三元組;

down為指標域,指向同一列中的下乙個三元組。

字串和多維陣列

一 字串 1 字串的定義 是零個或多個字串組成的有限序列,只包含空格的串稱為空格串。2 字串中任意個連續的字元組成的子串行稱為該穿的子串,包含子串的串稱為主串,子串的第乙個字元咋主串中的序號稱為子串在主串中的位置。3 模式匹配 給定兩個字串s和t,在主串s中尋找子串t的過程稱為模式匹配,t為模式。如...

字串和多維陣列

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

字串和多維陣列

intbf char s,char t else if t j 0 return start 1 else return0 int kmp char s,char p else if j plen return i j else return 1 陣列是乙個具有固定格式和數量的資料集合,在其上一般不...