資料結構 陣列 矩陣 廣義表儲存

2021-12-29 20:46:09 字數 3108 閱讀 5414

陣列的定義

陣列是下標index 和值value 組成的序對的集合。

在陣列中,每個有定義的下標都與乙個值對應,這個值稱做陣列元素。

每個序對形如: (index,value)由於計算機的記憶體結構是一維的,因此用一維記憶體來表示多維陣列,就必須按某種次序將陣列元素排成一列序列,然後將這個線性序列存放在儲存器中。

一般都是採用順序儲存的方法來表示陣列

一維陣列的順序表示

設第乙個陣列元素a[0]的儲存位址是loc(a[0]),若已知每個陣列元素佔k個儲存單元,則下標為i的陣列元素a[i]的儲存位址loc(a[i])為

loc(a[i])=loc(a[0])+i*k

i=0,1,2,…,n-1。

二維陣列的順序表示

二維陣列a[m][n]對映到一維的儲存空間時有兩種順序:行優先和列優先。

大多數語言如pascal、basic、c、c++等都是按行優先順序儲存的,fortran是按列優先順序儲存的。

矩陣的儲存——二維陣列

考慮:若矩陣階數很高,且有許多值相同的元素或零元素,怎麼提高儲存效率?

特殊矩陣——值相同的元素或者零元素在矩陣中的分布有一定規律

稀疏矩陣——矩陣中有大量零元素,非零元素比較少。

壓縮儲存:為多個相同的非零元素只分配乙個儲存空間;對零元素不分配空間。

若i≧j,則aij 在下三角矩陣中。 aij 之前的i-1行(從第1行到第i-1行)一共有1+2+…+i-1=i(i-1)/2個元素,在第i行上, aij 之前恰有j-1個元素(即ai0,ai1,ai2,…,aij-1),因此有:

k=i*(i-1)/2+j-1 當 i≧j

若i三角矩陣中的重複元素c可共享乙個儲存空間,其餘的元素正好有n(n+1)/2個,因此,三角矩陣可壓縮儲存到一維陣列sa[n(n+1)/2+1]中,其中c存放在陣列的第1個位置(亦可放在最後乙個位置)。

上三角矩陣元素aij儲存在陣列sa中時,下標值k與(i,j)之間的對應關係是?

下三角矩陣元素aij儲存在陣列sa中時,下標值k與(i,j)之間的對應關係是?

解決方法:在儲存非零元素的同時,同時記下它所在的行和列的位置(i, j)。

由於三元組(i, j, aij)唯一確定了矩陣a的乙個非零元。因此,稀疏矩陣可由表示非零元的三元組及其行列數唯一確定。

例如,下列三元組表

( (1,2,12), (1,3,9), (3,1,-3), (3,8,4), (4,3,24), (4,6,2), (5,2,18), (6,7,-7), (7,4,-6) ) 和行列資訊(7,8,9)便可描述如圖5.6所示的稀疏矩陣

注:行列資訊(7,8,9)中,7:行;8:列;9:非零元個數

以順序儲存結構來表示三元組表,則得到稀疏矩陣的一種壓縮儲存方法——三元順序表。

⑴ 三元組結點定義

#define max_size 1000

typedef int elemtype ;

typedef struct

triple ;⑵ 三元組順序表定義

typedef struct

tmatrix ;

tmatrix a;//定義了乙個用三元組順序表表示的稀疏矩陣設稀疏矩陣a是按行優先順序壓縮儲存在三元組表a.data中,若僅僅是簡單地交換a.data中i和j的內容,得到三元組表b.data,b.data將是乙個按列優先順序儲存的稀疏矩陣b,要得到按行優先順序儲存的b.data,就必須重新排列三元組表b.data中元素的順序。

由於a的列是b的行,因此,按a.data的列序轉置,所得到的轉置矩陣b的三元組表b.data必定是按行優先存放的。

按方法一求轉置矩陣的演算法如下:

void transmatrix(tmatrix a , tmatrix * b)

} }

快速轉置演算法如下

void fasttransmatrix(tmatrix a, tmatrix b)

olnode, *olink ; /* 非0元素結點 */

typedef struct

crosslist廣義表是線性表的推廣和擴充,在人工智慧領域中應用十分廣泛。

第2章中的線性表定義為n(n≧0 )個元素a1, a2 ,…, an的有窮序列,該序列中的所有元素具有相同的資料型別且只能是原子項(atom)。所謂原子項可以是乙個數或乙個結構,在結構上不可再分。若放鬆對元素的這種限制,容許它們具有其自身結構,就產生了廣義表的概念。

廣義表(lists,又稱為列表 ):是由n(n ≧0)個元素組成的有窮序列: ls=(a1,a2,…,an) ,其中ai或者是原子項,或者是乙個廣義表。ls是廣義表的名字,n為它的長度。若ai是廣義表,則稱為ls的子表。

習慣上:原子項用小寫字母,子表用大寫字母。

若廣義表ls非空時:

◆ a1(表中第乙個元素)稱為表頭;

◆ 其餘元素組成的子表稱為表尾;(a2,a3,…,an)

◆ 廣義表中所包含的元素(包括原子和子表)的個數稱為表的長 度。

◆ 廣義表中括號的最大層數稱為表深 (度)

廣義表的元素可以是原子項,也可以是子表,子表的元素又可以是子表, …。即廣義表是乙個多層次的結構。表5-2中的廣義表d的圖形表示如圖5-12所示。

廣義表可以被其它廣義表所共享,也可以共享其它廣義表。廣義表共享其它廣義表時不必列出子表的值,而是通過表名引用。如:d=(a,b,c)

廣義表本身可以是乙個遞迴表。如:e=(a,e)

根據對表頭、表尾的定義,任何乙個非空廣義表的表頭可以是原子,也可以是子表, 而表尾必定是廣義表。

由於廣義表中的資料元素具有不同的結構,通常用鏈式儲存結構表示,每個資料元素用乙個結點表示。因此,廣義表中就有兩類結點:

◆ 一類是表結點,用來表示廣義表項,由標誌域,表頭指標域,表尾指標域組成;

◆ 另一類是原子結點,用來表示原子項,由標誌域,原子的值域組成。如圖5-13所示。

只要廣義表非空,都是由表頭和表尾組成。即乙個確定的表頭和表尾就唯一確定乙個廣義表。

相應的資料結構定義如下:

typedef struct glnode

ptr ; /* ptr和atom兩成員共用 */

}gdata ;

} glnode ; /* 廣義表結點型別 */

資料結構 陣列 矩陣 和廣義表

陣列的儲存結構 一維陣列 多維陣列都是存放在乙個按行優先 也可以按列優先 的一維長陣列中。對稱矩陣中的元素是按主對角線對稱的,即上三角部分和下三角部分元素是對應相等的。在儲存時,一般儲存主對角線元素以及下三角部分元素,按行優先。n階對稱矩陣a可以儲存在一維陣列b 0.n n 1 2 1 一共需儲存n...

資料結構 8 陣列矩陣和廣義表

陣列 具有相同型別的資料元素的集合 一維陣列不說了,二維陣列 套娃陣列 行 列 體會一下 typedef int arra1 n typedef array1 array2 m 陣列特點 結構固定 維度和維界不變,沒有那些亂七八糟的操作 一般採取順序儲存結構來表示陣列 感覺還是比較簡單的 假設有乙個...

資料結構 陣列 廣義表

陣列,是有序的元素序列。若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。用於區分陣列的各個元素的數字編號稱為下標。陣列是在程式設計中,為了處理方便,把具有相同型別的若干元素按無序的形式組織起來的一種形式。這些無序排列的...