




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第五章第五章 數組和廣義表數組和廣義表 限制插入、刪除位置限制插入、刪除位置線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。限制元素類型為字符限制元素類型為字符棧棧僅在表尾進行插入和刪除操作的線性表。僅在表尾進行插入和刪除操作的線性表。隊列隊列在一端進行插入操作,而另一端進行在一端進行插入操作,而另一端進行刪除操作的線性表。刪除操作的線性表。串串零個或多個字符組成的有限序列零個或多個字符組成的有限序列 。特特殊殊線線性性表表回憶:回憶:特點:特點:數據元素都是非數據元素都是非結構的原
2、子類型,元素結構的原子類型,元素的值是不再分割的。的值是不再分割的。什么是線性表?什么是線性表?線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。將元素的類型進行擴充將元素的類型進行擴充廣廣義義線線性性表表(多維)數組(多維)數組線性表中的數據元素可以是線性表中的數據元素可以是線性表,但所有元素的類型相同。線性表,但所有元素的類型相同。廣義表廣義表線性表中的數據元素可以是線性表,線性表中的數據元素可以是線性表,且元素的類型可以不相同。且元素的類型可以不相同。數組和廣義表數組和廣義表 本章討論的兩種數據結構本章討論的兩種數據結構數組和廣義表數組和廣義表可以看成是線性
3、表的擴展,即表中的數據元素可以看成是線性表的擴展,即表中的數據元素本身也是一個線性表。本身也是一個線性表。5.1 數組數組的定義的定義5.3 矩陣矩陣的壓縮存儲的壓縮存儲 5.2 數組數組的順序表示和實現的順序表示和實現5.4 廣義表廣義表的類型定義的類型定義5.5 廣義表廣義表的表示方法的表示方法第第5章章 數組和廣義表數組和廣義表 5.1 數組的定義數組的定義n數組的定義數組的定義q數組是由一組類型相同的數據元素構成的有序集合,每數組是由一組類型相同的數據元素構成的有序集合,每個數據元素稱為一個數組元素(簡稱為元素),每個元個數據元素稱為一個數組元素(簡稱為元素),每個元素受素受n(n1)
4、個線性關系的約束,每個元素在個線性關系的約束,每個元素在n個線性關個線性關系中的序號系中的序號i1、i2、in稱為該元素的下標,并稱該數稱為該元素的下標,并稱該數組為組為 n 維數組。維數組。 n數組的特點數組的特點q元素本身可以具有某種結構,屬于同一數據類型;元素本身可以具有某種結構,屬于同一數據類型;q數組是一個具有固定格式和數量的數據集合。數組是一個具有固定格式和數量的數據集合。 a11 a12 a1n a21 a22 a2n am1 am2 amnA=例如,元素例如,元素a22受兩個線性關系的約束,在行上有受兩個線性關系的約束,在行上有一個行前驅一個行前驅a21和一個行后繼和一個行后繼
5、a23,在列上有一個列,在列上有一個列前驅前驅a12和和一個列后繼和和一個列后繼a32。數組示例數組示例5.1 數組的定義數組的定義 a11 a12 a1n a21 a22 a2n am1 am2 amnA= A=(A1,A2,An) 其中:其中: Ai=(a1i,a2i,ami) (1in)數組數組線性表的推廣線性表的推廣二維數組是二維數組是數據元素為線性表的線性表。數據元素為線性表的線性表。5.1 數組的定義數組的定義數組的基本操作數組的基本操作在數組中插入(或刪除)一個元素有意義嗎在數組中插入(或刪除)一個元素有意義嗎? a11 a12 a1n a21 a22 a2n am1 am2 a
6、mnA=將元素將元素 x 插入插入到數組中第到數組中第1行第行第2列。列。x a11 a12 a1n a21 a22 a2n am1 am2 amnA=刪除數組中刪除數組中第第1行第行第2列元素。列元素。5.1 數組的定義數組的定義數組一旦被定義,數組一旦被定義,它的維數和維界就它的維數和維界就不再改變,一般不不再改變,一般不做插入和刪除操作做插入和刪除操作數組的基本操作(存?。到M的基本操作(存?。?讀取:給定一組下標,讀出對應的數組元素;讀?。航o定一組下標,讀出對應的數組元素; 修改:給定一組下標,存儲或修改與其相對應的修改:給定一組下標,存儲或修改與其相對應的數組元素。數組元素。讀取和修
7、改操作本質上只對應一種操作讀取和修改操作本質上只對應一種操作尋址尋址數組應該采用何種方式存儲?數組應該采用何種方式存儲?數組沒有插入和刪除操作,所以,不用預留空間,數組沒有插入和刪除操作,所以,不用預留空間,適合采用順序存儲。適合采用順序存儲。5.1 數組的定義數組的定義數組的類型定義:p90設設一維數組一維數組的下標的范圍為閉區間的下標的范圍為閉區間l,h,每個每個數組元素占用數組元素占用 c 個存儲單元,則個存儲單元,則其其任一元任一元素素 ai 的的存儲地址可由下式確定:存儲地址可由下式確定: Loc(ai)Loc(al)(il)c c al ai-1 ai ah al+1 Loc(al
8、)Loc(ai)5.2 數組數組的順序表示和實現的順序表示和實現一維數組一維數組常用的映射方法有兩種:常用的映射方法有兩種:按按行行優先:優先:先行后列先行后列,先存儲行號較小的元素,先存儲行號較小的元素,行號相同者先存儲列號較小的元素行號相同者先存儲列號較小的元素。PASCAL、C;按按列列優先:優先:先列后行先列后行,先存儲列號較小的元素,先存儲列號較小的元素,列號相同者先存儲行號較小的元素。列號相同者先存儲行號較小的元素。FORTRAN;二維數組二維數組內內 存存二維結構二維結構一維結構一維結構5.2 數組數組的順序表示和實現的順序表示和實現二維數組二維數組l2h2 l1h1(a) 二維
9、數組二維數組aij前面的元素個數前面的元素個數=陰影部分表示的元素個數陰影部分表示的元素個數=整行數每行元素個數整行數每行元素個數+本行中本行中aij前面的元素個數前面的元素個數=( (i - -l1) )( (h2 - -l21) )( (j - -l2) )本行中本行中aij前面的元素個數前面的元素個數每行元素個數每行元素個數整整行行數數aij按行優先存儲的尋址按行優先存儲的尋址5.2 數組數組的順序表示和實現的順序表示和實現二維數組二維數組第第l1行行第第l1+1行行al1l2 al1h2 a(l1+1)l2 a(l1+1)h2 aij ah1h2Loc( (aij) )Loc( (al
10、1l2) )( (i - -l1) )( (h2 - -l21) )( (j - -l2) )個元素個元素Loc(aij)Loc(al1l2)(il1)(h2l21)(jl2)c按列優先存儲的尋址方法與此類似。按列優先存儲的尋址方法與此類似。按行優先存儲的尋址按行優先存儲的尋址5.2 數組數組的順序表示和實現的順序表示和實現二維數組二維數組例例5.2.1:以矩陣形式表示的:以矩陣形式表示的m行行n列的二維數組如下列的二維數組如下:若每個數組元素占用若每個數組元素占用 L 個存儲單元,個存儲單元,計算分別以計算分別以行序、列序為主序時行序、列序為主序時數據元素數據元素aij的存儲位置。的存儲位置
11、。Amn=a00 a01 a02 a0,n-1a10 a11 a12 a1,n-1 am-1,0 am-1,1 am-1,2 am-1,n-1行序為主序的存儲示圖:行序為主序的存儲示圖:a00 a01 a0n-1 a10 a11a1n-1 am-1,0 am-1,1 am-1,n-1數據元素數據元素aij的存儲位置:的存儲位置: loc(i,j)=loc(0,0)+aij之前的元素個數之前的元素個數LAmn=a00 a01 a02 a0,n-1a10 a11 a12 a1,n-1 am-1,0 am-1,1 am-1,2 am-1,n-1(i*n+j)列序為主序的存儲示圖:列序為主序的存儲示圖
12、:a00 a10 am-10 a01 a11am-1,1 a0,n-1 a1,n-1 am-1,n-1Amn=a00 a01 a02 a0,n-1a10 a11 a12 a1,n-1 am-1,0 am-1,1 am-1,2 am-1,n-1數據元素的存儲位置:數據元素的存儲位置: loc(i,j)=loc(0,0)+aij之前的元素個數之前的元素個數Lj*m+in特殊矩陣:特殊矩陣:包括對稱矩陣、三角矩陣、對角矩陣包括對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣等。和稀疏矩陣等。 n稀疏矩陣:稀疏矩陣:矩陣中有很多零元素。矩陣中有很多零元素。n壓縮存儲壓縮存儲的基本思想是:的基本思想是:q為多個值
13、相同的元素只分配一個存儲空間;為多個值相同的元素只分配一個存儲空間;q對零元素不分配存儲空間。對零元素不分配存儲空間。 5.3 矩陣矩陣的壓縮存儲的壓縮存儲 3647862842481697460582957A對稱矩陣特點:對稱矩陣特點:aij=aji如何壓縮存儲?如何壓縮存儲?只存儲下三角部分的元素。只存儲下三角部分的元素。5.3.1 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對稱矩陣對稱矩陣 (a) 下三角矩陣下三角矩陣 (b) 存儲說明存儲說明 (c) 計算方法計算方法aij在一維數組中的序號在一維數組中的序號=陰影部分的元素個數陰影部分的元素個數= i( (i+1) )/2+ j+1一維數組
14、下標從一維數組下標從0開始開始aij在一維數組中的下標在一維數組中的下標k= i( (i+1) )/2+ j 0 in- -10 j n- -1 aij每行元素個數每行元素個數12iaij在本行中的序號在本行中的序號aij第第0行行第第1行行第第i-1行行5.3.1 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對稱矩陣對稱矩陣 對于下三角中的元素對于下三角中的元素aij(ij),在數組,在數組SA中的下標中的下標k與與i、j的關系為:的關系為:ki(i1)/2j 。上三角中的元素上三角中的元素aij(ij),),因為因為aijaji,則訪問和則訪問和它對應的元素它對應的元素aji即可,即:即可,即:k
15、j(j1)/2i 。第第1行行第第n-1行行第第0行行 a00 a10 a11 a20 a21 a22 aij a n-10 an-11 an-1n-1 第第2行行0 1 2 3 4 5 k n(n+1)/2-15.3.1 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對稱矩陣對稱矩陣 令令 I = maxi,j, = maxi,j,J = mini,j, = mini,j,則則JIIk2) 1(3 cc c c6 2c c c4 81 c c7 46 0 c8 29 5 7(a)下三角矩陣下三角矩陣3 4 8 1 0c2 9 4 6cc 5 7cc c 0 8cc c c 7(b)上三角矩陣上三角矩陣
16、如何壓縮存儲?如何壓縮存儲?只存儲下三角(或上三角)部分的元素。只存儲下三角(或上三角)部分的元素。5.3.2 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲三角矩陣三角矩陣 矩陣中任一元素矩陣中任一元素aij在在數組數組中的下標中的下標k與與i、j的對應關系的對應關系:i( (i1) )/2j 當當ijn( (n1) )/2 當當ijk=0 1 2 3 4 5 k n(n+1)/2第第1行行第第0行行 a00 a10 a11 a20 a21 aij an-1n-1 第第2行行 c a22存儲存儲下三角下三角元素元素對角線上方的常數對角線上方的常數只存一個只存一個5.3.2 特殊矩陣特殊矩陣的壓縮存儲的
17、壓縮存儲三角矩陣三角矩陣 矩陣中任一元素矩陣中任一元素aij在在數組數組中的下標中的下標k與與i、j的對應關系:的對應關系: i( (2ni1) )/2ji 當當ijn( (n1) ) /2 當當ijk=存儲存儲上三角上三角元素元素對角線上方的常數對角線上方的常數只存一個只存一個5.3.1 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲三角矩陣三角矩陣 例例5.3.1:n假設以一維數組作為假設以一維數組作為n階對稱矩陣階對稱矩陣A的存儲空的存儲空間,以行序為主序存儲間,以行序為主序存儲A的下三角,則元素的下三角,則元素A56的值存儲在的值存儲在S_中。中。n 6*(6+1)/2+5=26對角矩陣:對角矩
18、陣:所有非零元素都集中在以主對角線為中心所有非零元素都集中在以主對角線為中心的帶狀區域中,除了主的帶狀區域中,除了主對角線和它的上下方若干條對對角線和它的上下方若干條對角線的元素外,所有其他元素都為零。角線的元素外,所有其他元素都為零。 a00 a01 0 0 0a10 a11 a12 0 00 a21 a22a23 00 0 a32a33 a340 0 0 a43 a44A=5.3.3 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對角矩陣對角矩陣 a00 a01 0 0 0a10 a11 a12 0 00 a21 a22a23 00 0 a32a33 a340 0 0 a43 a44A=將帶狀區將帶
19、狀區域立起來域立起來0 a00a01a10 a11 a12a21 a22 a23a32 a33 a34a43 a44 0B=sj- -i+1t=i映射到二維數組映射到二維數組B中,映射關系中,映射關系5.3.3 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對角矩陣對角矩陣 按行按行存儲存儲 元素元素aij在一維數組中的序號在一維數組中的序號=2 + 3( (i1) )+( ( ji + 2) )=2i+ j+1 一維數組下標從一維數組下標從0開始開始元素元素aij在一維數組中的下標在一維數組中的下標=2i+ j(b) 尋址的計算方法尋址的計算方法(c) 壓縮到一維數組中壓縮到一維數組中a00 a01
20、a10 a11 a12 a21 a22 a23 a32 a33 a34 a43 a440 1 2 3 4 5 6 7 8 9 10 11 12(a) 三對角矩陣三對角矩陣 0 0 0 0 00 00 0 0 0 0 A=a00 a01a10 a11 a12a21 a22 a23a32 a33 a34a43 a445.3.3 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲對角矩陣對角矩陣 15 0 0 0 0 0 0 11 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 9 0 0 0 0 0 A=如何只存儲非零元素?如何只存儲非零元素?注意:稀疏矩陣中的非零元素的分布沒有規律。注意:稀疏
21、矩陣中的非零元素的分布沒有規律。5.3.4 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲稀疏矩陣稀疏矩陣 29typedef struct int i, j; /行下標,列下標行下標,列下標 ElemType e; /非零元素值非零元素值 Triple ;將稀疏矩陣中的每個非零元素表示為將稀疏矩陣中的每個非零元素表示為:( (行號,列號,非零元素值行號,列號,非零元素值) )三元組三元組定義三元組:定義三元組:方法一方法一:稀疏矩陣的壓縮存儲:稀疏矩陣的壓縮存儲三元組三元組5.3.4 特殊矩陣特殊矩陣的壓縮存儲的壓縮存儲稀疏矩陣稀疏矩陣 三元組表三元組表:將稀疏矩陣的非零元素對應的三元組所將稀疏矩陣的
22、非零元素對應的三元組所構成的集合,構成的集合,按行優先的順序排列成一個線性表。按行優先的順序排列成一個線性表。三元組表三元組表( (0,0,15), (1,1,11), (2,3,6), (4,0,9) )15 0 0 0 0 0 0 11 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 9 0 0 0 0 0A=如何存儲三元組表?如何存儲三元組表?稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲三元組三元組采用順序存儲結構存儲三元組表采用順序存儲結構存儲三元組表15 0 0 22 0 - -15 0 11 3 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 91 0 0 0
23、0 0A=三元組順序表是否三元組順序表是否需要預留存儲空間?需要預留存儲空間?稀疏矩陣的修改操作稀疏矩陣的修改操作三元組順序表的插入三元組順序表的插入/ /刪除操作刪除操作稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲三元組三元組采用順序存儲結構存儲三元組表采用順序存儲結構存儲三元組表 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -115 0 0 22 0 - -15 0 11 3 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 91 0 0 0
24、0 0A=7(非零元個數)(非零元個數)是否對應唯一的稀疏矩陣?是否對應唯一的稀疏矩陣?5(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲三元組三元組三元組順序表以順序存儲結構表示三元組表,是稀疏矩陣的一種壓縮存儲方式。#define MAXSIZE 12500 /非零元個數最大值非零元個數最大值typedef struct int i, j; /行下標和列下標行下標和列下標ElemType e; Triple;typedef structTriple dataMAXSIZE+1; /非零元三元組表非零元三元組表,data0未用未用int mu,n
25、u,tu; /行數、列數、非零元個數行數、列數、非零元個數TSMatrix;TSMatrix a,b;例:例: 15 0 0 0 91 0 11 0 0 0 0 3 0 0 0 22 0 6 0 0 0 0 0 0 0 - -15 0 0 0 0 B=15 0 0 22 0 - -15 0 11 3 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 91 0 0 0 0 0A=三元組順序表操作三元組順序表操作轉置操作轉置操作 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0
26、123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 0 22 3 2 6 5 0 -15 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)三元組順序表操作三元組順序表操作轉置操作轉置操作三元組順序表操作三元組順序表操作轉置算法轉置算法1n基本思想:基本思想:在在A的三元組順序表中依次找第的三元組順序表中依次找第0列、第列、第1列、
27、列、直到最后一列的三元組,并將直到最后一列的三元組,并將找到的每個三元組的行、列交換后順序存儲到找到的每個三元組的行、列交換后順序存儲到B的三元組順序表中。的三元組順序表中。 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(
28、非零元個數)三元組順序表操作三元組順序表操作轉置算法轉置算法1 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)在矩陣在矩陣A中查找第中查找第0列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 0 0 15
29、 0 4 91 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11在矩陣在矩陣A中查找第中查找第1列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 0 0 15 0
30、3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3在矩陣在矩陣A中查找第中查找第2列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 0 0 15 0 3 22 0 5 -
31、-15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 0 22 3 2 6在矩陣在矩陣A中查找第中查找第3列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 0 0 15 0 3 22 0 5
32、- -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 2 6在矩陣在矩陣A中查找第中查找第4列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 3 0 22 0 0 15 0 3 22 0
33、5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 0 22 3 2 6 5 0 -15在矩陣在矩陣A中查找第中查找第5列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣B中中 0 0 15
34、 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) row col item0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 0 22 3 2 6 5 0 -15在矩陣在矩陣A中查找第中查找第6列非零元,順序存儲到矩陣列非零元,順序存儲到矩陣
35、B中中1. 設置轉置后矩陣設置轉置后矩陣B的行數、列數和非零元個數;的行數、列數和非零元個數;2. 在在B中設置初始存儲位置中設置初始存儲位置q;3. for (col=最小列號最小列號; col=最大列號最大列號; col+) 3.1 在在A中查找列號為中查找列號為col的三元組;的三元組; 3.2 交換其行號和列號,存入交換其行號和列號,存入B中中q位置;位置; 3.3 q+;三元組順序表操作三元組順序表操作轉置算法轉置算法1稀疏矩陣的轉置稀疏矩陣的轉置 (算法算法5.1) Status TransposeSMatrix(TSMatrix M,TSMatrix &T) int q,
36、col,p; T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;if (T.tu) q=1;for (col=1;col=T.mu;+col)for(p=1;p=M.tu;+p)if (M.datap.j=col) T.dataq.i=M.datap.j;T.dataq.j=M.datap.i;T.dataq.e=M.datap.e;+q; return OK; 三元組順序表操作三元組順序表操作轉置算法轉置算法1n該算法的主要時間耗費是在該算法的主要時間耗費是在col和和p的兩重循環上。的兩重循環上。n對于一個對于一個m行行n列且非零元素個數為列且非零元素個數為t的稀疏矩陣而的稀
37、疏矩陣而言,該算法的時間復雜度為言,該算法的時間復雜度為O(t*n)。n例:若矩陣有例:若矩陣有200行,行,200列,列,10,000個非零元素,個非零元素,總共有總共有2,000,000次處理。次處理。n最壞情況是,當稀疏矩陣中的非零元素個數最壞情況是,當稀疏矩陣中的非零元素個數t與與mn同數量級時,上述算法的時間復雜度就為同數量級時,上述算法的時間復雜度就為O(mn2)。n顯然這種情況下,該算法效率較低。顯然這種情況下,該算法效率較低。 分析分析:A中第中第0列的第一個非零元素一定存儲在列的第一個非零元素一定存儲在B中下中下標為標為0的位置上,該列中其它非零元素應存放在的位置上,該列中其
38、它非零元素應存放在B中中后面連續的位置上,那么第后面連續的位置上,那么第1列的第一個非零元素在列的第一個非零元素在B中的位置便等于第中的位置便等于第0列的第一個非零元素在列的第一個非零元素在B中的位中的位置加上第置加上第0列的非零元素的個數,以此類推。列的非零元素的個數,以此類推。 基本思想:基本思想:順序取,直接存。順序取,直接存。即即在在A中依次取三元中依次取三元組,交換其行號和列號放到組,交換其行號和列號放到B 中中適當適當位置。位置。如何確定當前從如何確定當前從A中取出的三元組在中取出的三元組在B中的位置?中的位置?三元組順序表操作三元組順序表操作轉置算法轉置算法2 row col i
39、tem0123456MaxTerm- -16(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) 0 0 15 0 4 91 1 1 11 2 1 3 3 0 22 3 2 6 5 0 -15第第0列第列第1個非零元素個非零元素第第0列有列有2個非零元素個非零元素第第1列第列第1個非零元素個非零元素三元組順序表操作三元組順序表操作轉置算法轉置算法2引入兩個數組作為輔助數據結構:引入兩個數組作為輔助數據結構:cnumcols:存儲矩陣存儲矩陣A中某列的非零元素的個數;中某列的非零元素的個數;cpotcols:初值表示矩陣初值表示矩陣A中某列的第一個非零元中某列
40、的第一個非零元素在素在B中的位置。中的位置。 數據結構設計:數據結構設計:cpot0=0;cpotcol=cpotcol- -1+cnumcol- -1; 1colcols-1cnum與與cpot存在如下遞推關系:存在如下遞推關系:三元組順序表操作三元組順序表操作轉置算法轉置算法2 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item0123456MaxTerm- -15(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數) col 0 1 2 3 4 5
41、 cnumcol 2 1 1 2 0 1 cpotcol 0 2 3 4 6 6根據矩陣根據矩陣A計算計算cnum和和cpot 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(
42、非零元個數)cpot0cpot1cpot2cpot3cpot4 cpot5 0 0 15cpot0 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)cpot1cpo
43、t2cpot3cpot4 cpot5 0 0 15cpot0 3 0 22cpot3 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)cpot1cpot2cpot4
44、 0 0 15cpot0 3 0 22cpot3 5 0 -15cpot5cpot5 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)cpot1cpot2cpot4
45、 0 0 15cpot0 3 0 22cpot3 5 0 -15cpot5 1 1 11cpot1 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)cpot2cpo
46、t4 0 0 15cpot0 3 0 22cpot3 5 0 -15cpot5 1 1 11cpot1 2 1 3cpot2cpot1 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5(矩陣的列數)(矩陣的列數)7(非零元
47、個數)(非零元個數)cpot4 0 0 15cpot0 3 0 22cpot3 5 0 -15cpot5 1 1 11 2 1 3cpot2cpot1 3 2 6cpot3 0 0 15 0 3 22 0 5 - -15 1 1 11 1 2 3 2 3 6 4 0 91 空空 空空 空空 閑閑 閑閑 閑閑row col item01234565(矩陣的行數)(矩陣的行數)6(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)將矩陣將矩陣A中中col列元素存放在列元素存放在B中下標為中下標為cpotcol的位置的位置 row col item01234566(矩陣的行數)(矩陣的行數)5
48、(矩陣的列數)(矩陣的列數)7(非零元個數)(非零元個數)cpot4 0 0 15cpot0 3 0 22 5 0 -15cpot5 1 1 11 2 1 3cpot2cpot1 3 2 6cpot3 0 4 91cpot01. 設置轉置后矩陣設置轉置后矩陣B的行數、列數和非零元素的個數;的行數、列數和非零元素的個數;2. 計算計算A中每一列的非零元素個數;中每一列的非零元素個數;3. 計算計算A中每一列的第一個非零元素在中每一列的第一個非零元素在B中的下標;中的下標;4. 依次取依次取A中的每一個非零元素對應的三元組;中的每一個非零元素對應的三元組; 4.1 確定該元素在確定該元素在B中的下
49、標中的下標q; 4.2 將該元素的行號列號交換后存入將該元素的行號列號交換后存入B中中q的位置;的位置; 4.3 預置該元素所在列的下一個元素的存放位置;預置該元素所在列的下一個元素的存放位置;三元組順序表操作三元組順序表操作轉置算法轉置算法2三元組順序表操作三元組順序表操作轉置算法轉置算法2n該算法中有該算法中有4個平行的個平行的for循環。循環。n對于一個對于一個m行行n列且非零元素個數為列且非零元素個數為t的稀疏矩的稀疏矩陣而言,循環次數分別為陣而言,循環次數分別為n和和t兩種,故此算法兩種,故此算法時間復雜度為時間復雜度為O(n+t)。n顯然該算法優于轉置算法顯然該算法優于轉置算法1。
50、 方法二:稀疏矩陣的壓縮存儲方法二:稀疏矩陣的壓縮存儲十字鏈表十字鏈表n當矩陣中非零元素的當矩陣中非零元素的個數個數和和位置位置經過運算后經過運算后變化變化較大較大時,就不宜采用順序存儲結構,而應采用時,就不宜采用順序存儲結構,而應采用鏈鏈式存儲結構式存儲結構來表示三元組。來表示三元組。n稀疏矩陣的鏈接表示采用十字鏈表:稀疏矩陣的鏈接表示采用十字鏈表:行鏈表行鏈表與與列列鏈表鏈表十字交叉。十字交叉。n行鏈表與列鏈表都是行鏈表與列鏈表都是帶表頭結點的循環鏈表帶表頭結點的循環鏈表。用。用表頭結點表征是第幾行,第幾列。表頭結點表征是第幾行,第幾列。n元素結點元素結點qrightright指向同一行中
51、下一指向同一行中下一個非零元素的指針(向右域)個非零元素的指針(向右域)qdowndown指向同一列中下一指向同一列中下一個非零元素的指針(向下域)個非零元素的指針(向下域)n表頭結點表頭結點q 行表頭結點行表頭結點q 列表頭結點列表頭結點q nextnext用于表示頭結點的鏈接用于表示頭結點的鏈接rowcolnextrightdownrowcolvalrightdown稀疏矩陣的十字鏈表表示的示例稀疏矩陣的十字鏈表表示的示例51122334455n需要輔助結點作鏈表的表頭,同時每個結點要需要輔助結點作鏈表的表頭,同時每個結點要增加兩個指針域,所以只有在矩陣較大和較稀增加兩個指針域,所以只有在
52、矩陣較大和較稀疏時才能起到節省空間的效果。疏時才能起到節省空間的效果。十字鏈表的類型定義十字鏈表的類型定義typedef struct OLNode /元素結點元素結點int i,j; /非零元的行和列下標非零元的行和列下標ElemType e;struct OLNode *right,*down; /該非零元所在行表和列該非零元所在行表和列 表的后繼鏈域表的后繼鏈域 OLNode, *OLink;typedef struct OLink *rhead,*chead; /行和列鏈表頭指針數組行和列鏈表頭指針數組int mu,nu,tu; CrossList; 2 0 2M=3 0 0 50 1
53、 0 02 0 0 0 0 0 3 0 3 5 1 1 1稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲十字鏈表十字鏈表n一維數組具有線性表的結構,操作簡單,一般不進一維數組具有線性表的結構,操作簡單,一般不進行插入和刪除操作,只定義給定下標讀取元素和修行插入和刪除操作,只定義給定下標讀取元素和修改元素的操作改元素的操作. .n二維數組中,每個數據元素對應一對數組下標,在二維數組中,每個數據元素對應一對數組下標,在行方向上和列方向上都存在一個線性關系,即存在行方向上和列方向上都存在一個線性關系,即存在兩個前驅和兩個后繼。也可看作是以線性表為數據兩個前驅和兩個后繼。也可看作是以線性表為數據元素的線性表。元
54、素的線性表。nn n維數組中,每個數據元素對應維數組中,每個數據元素對應n n個下標,受個下標,受n n個個關系的制約,其中任一個關系都是線性關系。可關系的制約,其中任一個關系都是線性關系??煽醋魇菙祿貫榭醋魇菙祿貫閚-1n-1維數組的一維數組。維數組的一維數組。n因此,多維數組和廣義表是對線性表的擴展:線因此,多維數組和廣義表是對線性表的擴展:線性表中的數據元素本身又是一個多層次的線性表。性表中的數據元素本身又是一個多層次的線性表。5.4 廣義表的類型定義廣義表的類型定義ADT Glist 數據對象:數據對象:D ei | i=1,2,.,n; n0; eiAtomSet 或或 ei
55、GList, AtomSet為某個數據對象為某個數據對象 數據關系:數據關系: LR| ei-1 ,eiD, 2in ADT Glist基本操作基本操作:廣義表是廣義表是遞歸遞歸定義的定義的線性結構線性結構 LS = ( 1, 2, , n )其中:其中:i 或為原子或為原子 或為廣義表或為廣義表例如例如: A = ( ) F = (d, (e) D = (a,(b,c), F) C = (A, D, F) B = (a, B) = (a, (a, (a, , ) ) ) /遞歸表遞歸表廣義表是一個廣義表是一個多層次多層次的的線性結構線性結構例如:例如:D=(E, F)其中其中: : E=(a
56、, (b, c) F=(d, (e)DEFa( )d( )bce廣義表廣義表 LS = ( 1, 2, , n )的結構特點的結構特點:1) 廣義表中的數據元素有相對廣義表中的數據元素有相對次序次序;2) 廣義表的廣義表的長度長度定義為最外層包含元素個數定義為最外層包含元素個數;3) 廣義表的廣義表的深度深度定義為所含括弧的重數定義為所含括弧的重數; 注意注意:“原子原子”的深度為的深度為 0 ; “空表空表”的深度為的深度為 1 。4) 廣義表可以廣義表可以共享共享; 廣義表可以是一個廣義表可以是一個遞歸遞歸的表的表 遞歸表的深度是無窮值,長度是有限值。遞歸表的深度是無窮值,長度是有限值。6
57、) 任何一個非空廣義表任何一個非空廣義表 LS = (1, 2, , n) 均可分解為均可分解為 表頭表頭 Head(LS) = 1 和和 表尾表尾 Tail(LS) = (2, , n) 兩部分兩部分例如例如: D = (E, F) = (a, (b, c),F )Head(D) = E Tail(D) = (F)Head(E) = a Tail(E) = (b, c)Head(b, c) = (b, c) Tail(b, c) = ( )Head(b, c) = b Tail(b, c) = (c)Head(c) = c Tail(c) = ( ) 結構的創建和銷毀結構的創建和銷毀 InitGList(&L); DestroyGList(&L); CreateGList(&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中小學生綜合素質培養與發展方向
- 獸醫行業倫理案例分享試題及答案
- 2025年搪瓷制品相關日用品生產設備合作協議書
- 九年級下冊道德與法治第一單元 我們共同的世界復習提綱
- 大數據時代的職業發展與機會
- 學生綜合素質評價體系的構建與應用
- 新工人入場安全培訓考試題及完整答案(歷年真題)
- 企業危機公關與應對策略分析報告
- 產品設計與商業模式的創新關系
- 可持續建筑技術集成創新企業制定與實施新質生產力戰略研究報告
- 《預制高強混凝土風電塔筒生產技術規程》文本附編制說明
- 2024年中國住院患者血糖管理專家共識
- 【MOOC】設計思維與創新設計-浙江大學 中國大學慕課MOOC答案
- 《如何說孩子才會聽怎么聽孩子才肯說》讀書分享
- 旅客列車安全平穩操縱辦法
- 《混凝土結構設計原理》全套教學課件
- 醫療安全(不良)事件報告制度培訓課件
- 《用單擺測量重力加速度》說課稿
- 人教版九年級上冊音樂 1.5中國人民解放軍軍歌 教案
- 2024報關員勞動合同范本(標準版)
- 工業園保潔綠化服務投標方案(技術方案)
評論
0/150
提交評論