資料結構第四章

2021-06-26 15:50:16 字數 3837 閱讀 3587



第四章字串和多維陣列

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...