




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1第第5章章 數組和廣義表(數組和廣義表(Arrays & Lists)5.1 數組的定義數組的定義5.2 數組的順序表示和實現數組的順序表示和實現5.3 矩陣的壓縮存儲矩陣的壓縮存儲(即數組的應用即數組的應用)5.4 廣義表的定義廣義表的定義5.5 廣義表的存儲結構廣義表的存儲結構2線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。限制插入、刪除位置限制插入、刪除位置線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。限制元素類型為字符限制元素類型為字符棧棧僅在表尾進行插入和刪除操作的線性表。僅在表尾進行插入和刪除操作的線性表
2、。隊列隊列在一端進行插入操作,而另一端進行在一端進行插入操作,而另一端進行 刪除操作的線性表。刪除操作的線性表。串串零個或多個字符組成的有限序列零個或多個字符組成的有限序列 。特殊線性表特殊線性表第第5章章 數組和廣義表數組和廣義表 3線性表線性表具有相同類型的數據元素的有限序列。具有相同類型的數據元素的有限序列。將元素的類型進行擴充將元素的類型進行擴充廣義線性表廣義線性表(多維)數組(多維)數組線性表中的數據元素可以是線性表中的數據元素可以是線性表,但所有元素的類型相同。線性表,但所有元素的類型相同。廣義表廣義表線性表中的數據元素可以是線性表,線性表中的數據元素可以是線性表,且元素的類型可以
3、不相同。且元素的類型可以不相同。第第5章章 數組和廣義表數組和廣義表 45.1 數組的定義數組的定義數組是由一組數組是由一組類型相同類型相同的數據元素構成的的數據元素構成的有序有序集集合合,每個數據元素稱為一個數組元素(簡稱為元每個數據元素稱為一個數組元素(簡稱為元素),每個元素受素),每個元素受n(n1)個個線性關系線性關系的約束,的約束,每每個元素在個元素在n個線性關系中的序號個線性關系中的序號i1、i2、in稱為稱為該元素的下標,并稱該數組為該元素的下標,并稱該數組為 n 維數組。維數組。 數組的特點數組的特點元素本身可以具有某種結構,屬于同一數據類型;元素本身可以具有某種結構,屬于同一
4、數據類型;數組是一個具有固定格式和數量的數據集合。數組是一個具有固定格式和數量的數據集合。5 a11 a12 a1n a21 a22 a2n am1 am2 amnA=例如,元素例如,元素a22受兩個線性關系的約束,在行上有受兩個線性關系的約束,在行上有一個行前驅一個行前驅a21和一個行后繼和一個行后繼a23,在列上有一個列,在列上有一個列前驅前驅a12和和一個列后繼和和一個列后繼a32。數組示例數組示例5.1 數組的定義數組的定義6 a11 a12 a1n a21 a22 a2n am1 am2 amnA= A=(A1,A2,An) 其中:其中: Ai=(a1i,a2i,ami) (1in)
5、二維數組是數據元素為線性表的線性表。二維數組是數據元素為線性表的線性表。5.1 數組的定義數組的定義7ADT Array 數據對象數據對象: Daj1,j2, .,ji,jn| ji =0,.,bi -1, i=1,2,.,n 數據關系數據關系: RR1, R2, ., Rn Ri | 0 jk bk -1, 1 k n 且且k i, 0 ji bi -2, i=2,.,n ADT Array 基本操作基本操作:5.1 數組的定義數組的定義8二維數組的定義二維數組的定義:數據對象數據對象: : D = aij | 0ib1-1, 0 jb2-1數據關系數據關系: : R = ROW, COL
6、ROW = | 0ib1-2, 0jb2-1 COL = | 0ib1-1, 0 jb2-29基本操作基本操作:InitArray (&A, n, bound1, ., boundn)DestroyArray(&A)操作結果:操作結果:若維數若維數 n 和各維長度合法,則構造相應的和各維長度合法,則構造相應的 數組數組A,并返回,并返回OK。操作結果:操作結果:銷毀數組銷毀數組A。10Value(A, &e, index1, ., indexn) 初始條件:初始條件:A是是n維數組,維數組,e為元素變量,隨后是為元素變量,隨后是n 個個 下標值。下標值。 操作結果:操作
7、結果:若各下標不超界,則若各下標不超界,則e賦值為所指定的賦值為所指定的A 的元素值,并返回的元素值,并返回OK。Assign(&A, e, index1, ., indexn)初始條件:初始條件:A是是n維數組,維數組,e為元素變量,隨后是為元素變量,隨后是n 個下個下 標值。標值。操作結果:操作結果:若下標不超界,則將若下標不超界,則將e的值賦給所指定的的值賦給所指定的A的的 元素,并返回元素,并返回OK?;静僮骰静僮鳎?1數組的基本操作數組的基本操作 存?。航o定一組下標,讀出對應的數組元素;存?。航o定一組下標,讀出對應的數組元素; 修改:給定一組下標,存儲或修改與其相對應的修
8、改:給定一組下標,存儲或修改與其相對應的數組元素。數組元素。存取和修改操作本質上只對應一種操作存取和修改操作本質上只對應一種操作尋址尋址數組應該采用何種方式存儲?數組應該采用何種方式存儲?數組沒有插入和刪除操作,所以,不用預留空間,數組沒有插入和刪除操作,所以,不用預留空間,適合采用順序存儲。適合采用順序存儲。5.1 數組的定義數組的定義12類型特點類型特點:1) 只有引用型操作,沒有加工型操作只有引用型操作,沒有加工型操作;2) 數組是多維的結構,而存儲空間是一數組是多維的結構,而存儲空間是一個個 一維的結構。一維的結構。有兩種順序映象的方式有兩種順序映象的方式:1)以行序為主序以行序為主序
9、(低下標優先低下標優先);2)以列序為主序以列序為主序(高下標優先高下標優先);5.2 數組的順序表示和實現數組的順序表示和實現 135.2 數組的順序表示和實現數組的順序表示和實現一維一維設一維數組的下標的范圍為閉區間設一維數組的下標的范圍為閉區間l,h,每個每個數組元素占用數組元素占用 c 個存儲單元,則個存儲單元,則其其任一元任一元素素 ai 的的存儲地址可由下式確定:存儲地址可由下式確定: Loc(ai)Loc(al) (il)c c al ai-1 ai ah al+1 Loc(al)Loc(ai)14常用的映射方法有兩種:常用的映射方法有兩種:按按行行優先:優先:先行后列先行后列,
10、先存儲行號較小的元素,先存儲行號較小的元素,行號相同者先存儲列號較小的元素。行號相同者先存儲列號較小的元素。 按按列列優先:優先:先列后行先列后行,先存儲列號較小的元素,先存儲列號較小的元素,列號相同者先存儲行號較小的元素。列號相同者先存儲行號較小的元素。 二維數組二維數組內內 存存二維結構二維結構一維結構一維結構5.2 數組的順序表示和實現數組的順序表示和實現二維二維15l2h2 l1h1(a) 二維數組二維數組aij前面的元素個數前面的元素個數=陰影部分的面積陰影部分的面積=整行數每行元素個數整行數每行元素個數+本行中本行中aij前面的元素個數前面的元素個數=( (i - -l1) )(
11、(h2 - -l21) )( (j - -l2) )本行中本行中aij前面的元素個數前面的元素個數每行元素個數每行元素個數整整行行數數aij按行優先存儲的尋址按行優先存儲的尋址5.2 數組的順序表示和實現數組的順序表示和實現二維二維16第第l1行行第第l1+1行行al1l2 al1h2 a(l1+1)l2 a(l1+1)h2 aij ah1h2Loc( (aij) )Loc( (al1l2) )( (i - -l1) )( (h2 - -l21) )( (j - -l2) )個元素個元素Loc(aij)Loc(al1l2)(il1)(h2l21)(jl2)c按行優先存儲的尋址按行優先存儲的尋址
12、按列優先存儲的尋址方法與此類似。按列優先存儲的尋址方法與此類似。5.2 數組的順序表示和實現數組的順序表示和實現二維二維17Loc (j1, j2, jn)=LOC(0,0,0)若是若是N維數組,其中任一元素的地址該如何計算?維數組,其中任一元素的地址該如何計算?niii1jC其中其中Cn=L, Ci-1=biCi, 1in Ci = bi+1 bi+2 bn L一個元素長度一個元素長度數組基址數組基址前面若干元素占用前面若干元素占用的地址字節總數的地址字節總數第第i i維長度維長度與所存元素個數有關的系與所存元素個數有關的系數,可用遞推法求出數,可用遞推法求出教材已給出教材已給出低維優先低維
13、優先的地址計算公式,的地址計算公式,見見P93(5-2)式式該式稱為該式稱為n n維數組的映像函數維數組的映像函數: C i = b i+1 b i+2 b n L5.2 數組的順序表示和實現數組的順序表示和實現NN維維18“行序為主序行序為主序” 即即 “低下標優低下標優先先”“列序為主序列序為主序” 即即 “高下標優高下標優先先”如如: A324 的存儲次序為的存儲次序為:(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,1,0),(0,1,3),(1,0,0),(1,1,0),(1,1,3),(2,0,0),(2,1,3)(0,0,0),(1,0,0),(2,0,0)
14、,(0,1,0),(2,1,0),(0,0,1),(0,1,1),(0,0,2),(2,1,2),(0,0,3),(2,1,3)則則 A324 的存儲次序為的存儲次序為:19例例2:已知二維數組已知二維數組Am,m按行存儲的元素地址公式是:按行存儲的元素地址公式是: Loc(aij)= Loc(a11)+(i-1)*m+(j-1)*K 按列存儲的公式是?按列存儲的公式是? Loc(aij)=Loc(a11)+(j-1)*m+(i-1)*K (盡管是方陣,但公式仍不同)(盡管是方陣,但公式仍不同)例例1軟考題軟考題:一個二維數組一個二維數組A A,行下標的范圍是,行下標的范圍是1到到6, 列下標
15、的范圍是列下標的范圍是0到到7,每個數組元素用相鄰的,每個數組元素用相鄰的6個字節存個字節存儲,存儲器按字節編址。那么,這個數組的體積是多少儲,存儲器按字節編址。那么,這個數組的體積是多少個字節?個字節? 288答:答: Volume=m*n*L=(6-1+1)*(7- 0 +1)*6=48*6=288練習:練習:20例例3:設數組設數組a160, 170的基地址為的基地址為2048,每個元,每個元素占素占2個存儲單元,若以列序為主序順序存儲,則元素個存儲單元,若以列序為主序順序存儲,則元素a32,58的存儲地址為的存儲地址為 。LOC(aij)=LOC(ac1,c2)+(j-c2)*(d1-
16、c1+1)+i-c1)*L得:得:LOC(a32,58)=2048+(58-1)*(60-1+1)+32-1)*28950答:答:請注意審題!請注意審題! 利用列優先通式:利用列優先通式:8950練習:練習:21#define MAX_ARRAY_DIM 8 /假設最大維數為假設最大維數為8 8 typedef struct ELemType *base; /數組元素基址數組元素基址 int dim; /數組維數數組維數 int *bound; /數組數組各維長度信息保存區各維長度信息保存區基址基址 int *constants; /數組數組映像函數常量映像函數常量的基址的基址 Array;即
17、即Ci信息保存區信息保存區數組的基本操作函數說明(有數組的基本操作函數說明(有4個)個)(請閱讀教材(請閱讀教材P93-95)N維數組的順序存儲表示(見教材見教材P93)以銷毀數組函數為例以銷毀數組函數為例22 :利用宏利用宏va_start、va_arg和和va_end提供提供遍歷未知數目和類型的函數參數表的功能。遍歷未知數目和類型的函數參數表的功能。Va_start ( va_list ap, x ):初始化初始化ap,使其指向所,使其指向所在函數的參數在函數的參數x x之后的第一個參數。之后的第一個參數。Va_arg ( va_list ap , 類型類型):返回返回apap當前指向的參
18、數當前指向的參數的值,并修改的值,并修改ap,使得,使得ap指向下一個參數(指向下一個參數(“類型類型”為參數類型)。為參數類型)。Va_end ( va_list ap):用在所有的參數處理完畢之后,用在所有的參數處理完畢之后,表示表示ap使用完畢。使用完畢。幾個函數說明:幾個函數說明:23Status InitArray (Array &A, int dim,) /若維數若維數dim和各維長度合法,則和各維長度合法,則并返回并返回OK if (dimMAX_ARRAY_DIM) return ERROR; A.dim=dim; A.bounds=(int *)malloc(dim
19、* sizeof(int); if(!a.bounds) exit (OVERFLOW); / 分配存放分配存放“各維長度各維長度”的空間的空間 /若各維長度合法,則存入若各維長度合法,則存入A.bounds, ,并求出并求出A的元素總數的元素總數elemtotal elemtotal=1; va_start(ap, dim); /ap為為va_list類型,是存放變長參數表信息的類型,將類型,是存放變長參數表信息的類型,將ap指指向向dim后后的第一個參數的第一個參數數組的基本操作函數說明(數組的基本操作函數說明(5個)個) (見教材見教材P93-95)24 for(i=0;idim;+i)
20、 A.boundsi=va_arg (ap, int); / 返回返回ap當前指向的參數,并按參數類型將當前指向的參數,并按參數類型將ap指向下一個參數指向下一個參數 if (A.boundsi=0;-i) A.constantsi=A.boundsi+1*A.constantsi+1; return OK; b i+1 C i+1 26數組基址指針數組基址指針各維長度保各維長度保存區指針存區指針映像函數映像函數Ci保存區指針保存區指針Status DestroyArray (Array &A) /銷毀數組銷毀數組A A if ( ! A.base ) return ERROR; fr
21、ee(A.base); A .base = NULL; if ( ! A.bounds ) return ERROR; free( A .bounds ); A.bounds = NULL; if ( !A.constants ) return ERROR; free ( A. constants ) ; A. constants = NULL; return OK; 數組的基本操作函數數組的基本操作函數 27Status Locate(Array A, va_list ap, int &off) /若若ap指示的各下標值合法,則求出該元素在指示的各下標值合法,則求出該元素在A中相對地
22、址中相對地址off off=0; for(i=0;iA.dim;+i) ind= va_arg(ap, int); if (indA.boundsi) return OVERFLOW; off += A.constantsi * ind ; C i j i return OK; 數組的基本操作函數數組的基本操作函數 28Status Value(Array A, ElemType &e,) /A是是n n維數組,維數組,e e為元素變量,隨后是為元素變量,隨后是n n個下標值,若各下個下標值,若各下 標不超界,則標不超界,則e e賦值為所指定的賦值為所指定的A A的元素值,即將指定元素
23、的元素值,即將指定元素 值讀到值讀到e e變量中。變量中。 va_start (ap, e); / / 將將apap指向指向e e后的參數后的參數 if (result=Locate(A, ap, off)=0) return result; e=*(A.base+off); return OK; 數組的基本操作函數數組的基本操作函數 29Status Assign(Array &A,ElemType e,) /A是是n n維數組,維數組,e e為元素變量,隨后是為元素變量,隨后是n n個下標值,若各下個下標值,若各下 標不超界,則標不超界,則e e的值賦為所指定的的值賦為所指定的A
24、A的元素值,的元素值, va_start(ap,e); if( (result=Locate(A,ap,off ) )=0) return result; *(A.base+off)=e; return OK; 數組的基本操作函數數組的基本操作函數 30行指針向量行指針向量a11a12a1nam1am2amn 鏈式存儲方式:鏈式存儲方式:用帶行指針向量的單鏈表來表示。用帶行指針向量的單鏈表來表示。注:注:數組的運算參見下一節實例(稀疏矩陣的轉置)數組的運算參見下一節實例(稀疏矩陣的轉置)補充:補充: 315.3 矩陣的壓縮存儲一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲 二二. 稀疏矩陣的壓縮
25、存儲稀疏矩陣的壓縮存儲三三. 稀疏矩陣的轉置操作稀疏矩陣的轉置操作 325.3 矩陣的壓縮存儲討論:討論:1. 什么是壓縮存儲?什么是壓縮存儲?若多個數據元素的若多個數據元素的值都相同值都相同,則只分配一個元素值的,則只分配一個元素值的存儲空間,且零元素不占存儲空間。存儲空間,且零元素不占存儲空間。2. 什么樣的矩陣具備壓縮條件?什么樣的矩陣具備壓縮條件? 特殊矩陣(對稱矩陣,對角矩陣,三角矩陣)特殊矩陣(對稱矩陣,對角矩陣,三角矩陣)和稀疏矩陣。和稀疏矩陣。33特殊矩陣:特殊矩陣:矩陣中很多值相同的元素并且它們的分布矩陣中很多值相同的元素并且它們的分布有一定的規律。有一定的規律。稀疏矩陣稀疏
26、矩陣: :矩陣中非零元素的個數較少(一般小于矩陣中非零元素的個數較少(一般小于5%)壓縮存儲的基本思想是:壓縮存儲的基本思想是: 為多個值為多個值相同相同的元素只分配的元素只分配一個一個存儲空間;存儲空間; 對對零零元素元素不分配不分配存儲空間。存儲空間。 特殊矩陣和稀疏矩陣特殊矩陣和稀疏矩陣5.3 矩陣的壓縮存儲34一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對稱矩對稱矩陣陣 3647862842481697460582957A對稱矩陣特點:對稱矩陣特點:aij=aji如何壓縮存儲?如何壓縮存儲?只存儲下三角部分的元素。只存儲下三角部分的元素。35(a) 下三角矩陣下三角矩陣 (b) 存儲說
27、明存儲說明 (c) 計算方法計算方法aij在一維數組中的序號在一維數組中的序號=陰影部分的面積陰影部分的面積= i( (i+1) )/2+ j+1一維數組下標從一維數組下標從0開始開始aij在一維數組中的下標在一維數組中的下標k= i( (i+1) )/2+ j 0 in- -10 j n- -1 aij每行元素個數每行元素個數12iaij在本行中的序號在本行中的序號aij第第0行行第第1行行第第i-1行行一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對稱矩對稱矩陣陣 36對于對于下三角下三角中的元素中的元素aij(ij),在數組,在數組SA中的下標中的下標k與與i、j的關系為:的關系為:ki(
28、i1)/2j 。上三角上三角中的元素中的元素aij(ij),),因為因為aijaji,則訪問和則訪問和它對應的元素它對應的元素aji即可,即:即可,即:kj(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-1一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對稱矩對稱矩陣陣 37一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲三角矩陣三角矩陣 3 cc c c6 2c c c4 81 c c7 46 0 c8 29 5 7(a)下三角矩陣下三角矩陣
29、3 4 8 1 0c2 9 4 6cc 5 7cc c 0 8cc c c 7(b)上三角矩陣上三角矩陣如何壓縮存儲?如何壓縮存儲?只存儲上三角(或下三角)部分的元素。只存儲上三角(或下三角)部分的元素。38矩陣中任一元素矩陣中任一元素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存儲存儲下三角下三角元素元素對角
30、線上方的常數對角線上方的常數只存一個只存一個一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲三角矩陣三角矩陣 39矩陣中任一元素矩陣中任一元素aij在在數組數組中的下標中的下標k與與i、j的對應關系:的對應關系: i( (2ni1) )/2ji 當當ijn( (n1) ) /2 當當ijk=上三角矩陣的壓縮存儲上三角矩陣的壓縮存儲存儲存儲上三角上三角元素元素對角線上方的常數對角線上方的常數只存一個只存一個一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲三角矩陣三角矩陣 40對角矩陣:對角矩陣:所有非零元素都集中在以主對角線為中心所有非零元素都集中在以主對角線為中心的帶狀區域中,除了主的帶狀區域中,除了
31、主對角線和它的上下方若干條對對角線和它的上下方若干條對角線的元素外,所有其他元素都為零。角線的元素外,所有其他元素都為零。 a00 a01 0 0 0a10 a11 a12 0 00 a21 a22a23 00 0 a32a33 a340 0 0 a43 a44A=一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對角矩陣對角矩陣 41a00 a01 0 0 0a10 a11 a12 0 00 a21 a22a23 00 0 a32a33 a340 0 0 a43 a44A=將帶狀區將帶狀區域立起來域立起來0 a00a01a10 a11 a12a21 a22 a23a32 a33 a34a43 a4
32、4 0B=sj- -i+1t=i映射到二維數組映射到二維數組B中,映射關系中,映射關系一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對角矩陣對角矩陣 42按行按行存儲存儲 元素元素aij在一維數組中的序號在一維數組中的序號=2 + 3( (i1) )+( ( ji + 2) )=2i+ j+1 一維數組下標從一維數組下標從0開始開始元素元素aij在一維數組中的下標在一維數組中的下標=2i+ j(b) 尋址的計算方法尋址的計算方法(c) 壓縮到一維數組中壓縮到一維數組中a00 a01 a10 a11 a12 a21 a22 a23 a32 a33 a34 a43 a440 1 2 3 4 5 6
33、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 a44一一. 特殊矩陣的壓縮存儲特殊矩陣的壓縮存儲對角矩陣對角矩陣 43二、稀疏矩陣的壓縮存儲二、稀疏矩陣的壓縮存儲問題:問題:如果只存儲如果只存儲稀疏矩陣中的非零元素,那這些元素的稀疏矩陣中的非零元素,那這些元素的位置信息位置信息該如何表示?該如何表示?解決思路:解決思路:對每個非零元素對每個非零元素增開增開若干存儲單元,例如存放其所若干存儲單元,例如存放其所在的行號和列號,便可準確反映該元素所在位置
34、。在的行號和列號,便可準確反映該元素所在位置。實現方法:實現方法:將每個非零元素用一個三元組將每個非零元素用一個三元組(i,j,aij)來表示,來表示,則每個則每個稀疏矩陣可用一個稀疏矩陣可用一個三元組表三元組表來表示。來表示。44將稀疏矩陣中的每個非零元素表示為將稀疏矩陣中的每個非零元素表示為:( (行號,列號,非零元素值行號,列號,非零元素值) )三元組三元組定義三元組:定義三元組:二、稀疏矩陣的壓縮存儲二、稀疏矩陣的壓縮存儲#define MAXSIZE 125000 /設非零元素最大個數設非零元素最大個數125000 typedef struct int i; /元素行號元素行號 in
35、t j; /元素列號元素列號 ElemType e; /元素值元素值 Triple;/一個結點的結構定義一個結點的結構定義45三元組表三元組表:將稀疏矩陣的非零元素對應的三元組所將稀疏矩陣的非零元素對應的三元組所構成的集合,構成的集合,按行優先的順序排列成一個線性表。按行優先的順序排列成一個線性表。三元組表三元組表( (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=如何存儲三元組表?如何存儲三元組表?二、稀疏矩陣的壓縮存儲二、稀疏矩陣的壓縮存
36、儲46稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲三元組順序表三元組順序表二、稀疏矩陣的壓縮存儲二、稀疏矩陣的壓縮存儲typedef struct Triple dataMAXSIZE+1; /三元組表,以行為主序存入一維向量三元組表,以行為主序存入一維向量 data 中中 int mu; /矩陣總行數矩陣總行數 int nu; /矩陣總列數矩陣總列數 int tu; /矩陣中非零元素總個數矩陣中非零元素總個數 TsMatrix; /整個三元組表的定義整個三元組表的定義47采用采用鏈接鏈接存儲結構存儲三元組表,每個非零元素對應存儲結構存儲三元組表,每個非零元素對應的三元組存儲為一個鏈表結點,結構為:的
37、三元組存儲為一個鏈表結點,結構為: rowcolitemdownrightrow:存儲非零元素的行號存儲非零元素的行號col:存儲非零元素的列號存儲非零元素的列號item:存儲非零元素的值存儲非零元素的值right:指針域,指向同一行中的下一個三元組指針域,指向同一行中的下一個三元組down:指針域,指向同一列中的下一個三元組指針域,指向同一列中的下一個三元組稀疏矩陣的壓縮存儲稀疏矩陣的壓縮存儲十字鏈表十字鏈表二、稀疏矩陣的壓縮存儲二、稀疏矩陣的壓縮存儲480 12 9 0 0 00 0 0 0 0 0-3 0 0 0 14 00 0 24 0 0 00 18 0 0 0 015 0 0 -7
38、 0 00 0 3 0 0 1512 0 0 0 18 0 9 0 0 24 0 00 0 0 0 0 -70 0 14 0 0 00 0 0 0 0 0(1, 2, 12)(1, 3, 9 )(3, 1, -3)(3, 5, 14)(4, 3, 24)(5, 2, 18)(6, 1, 15)(6, 4, -7)(1, 3, -3)(1, 6, 15)(2, 1, 12)(2, 5, 18)(3, 1, 9)(3, 4, 24)(4, 6, -7)(5, 3, 14)三三元元組組表表a.data三三元元組組表表b.data轉置后轉置后MT目的:目的:三、稀疏矩陣的轉置操作三、稀疏矩陣的轉置操作
39、49答:答:肯定不正確!肯定不正確!除了:除了: (1)每個元素的行下標和列下標互換(即三元組中每個元素的行下標和列下標互換(即三元組中的的i i和和j j互換互換););還應該還應該:(:(2)T T的總行數的總行數mumu和總列數和總列數nunu與與M M的不同的不同(互換);互換); (3)重排重排三元組內元素順序三元組內元素順序,使轉置后的三元組也,使轉置后的三元組也按行(或列)為主序有規律的排列。按行(或列)為主序有規律的排列。上述(上述(1 1)和()和(2 2)容易實現,難點在)容易實現,難點在(3 3)。 若采用三元組壓縮技術存儲稀疏矩陣,只要把每個若采用三元組壓縮技術存儲稀疏
40、矩陣,只要把每個元素的元素的行下標和列下標互換行下標和列下標互換,就完成了對該矩陣的轉置運,就完成了對該矩陣的轉置運算,這種說法正確嗎?算,這種說法正確嗎? 有兩種實現方法有兩種實現方法壓縮轉置壓縮轉置( (壓縮壓縮) )快速轉置快速轉置提問:提問:50算法算法 壓縮轉置壓縮轉置基本思想:基本思想:直接取,順序存直接取,順序存。即。即在在A的三元組順序的三元組順序表中表中依次依次找第找第0列、第列、第1列、列、直到最后一列的三元直到最后一列的三元組,并將找到的每個三元組的行、列交換后組,并將找到的每個三元組的行、列交換后順序順序存存儲到儲到B的三元組順序表中。的三元組順序表中。 三、稀疏矩陣的
41、轉置操作三、稀疏矩陣的轉置操作51方法方法1 1:壓縮轉置壓縮轉置思路:思路:反復掃描反復掃描a.data中的中的列序列序,從小到大依次進行轉置。,從小到大依次進行轉置。三三元元組組表表a.data三三元元組組表表b.data(1, 3, -3)(1, 6, 15)(2, 1, 12) (2, 5, 18)(3, 1, 9) (3, 4, 24) (4, 6, -7) (5, 3, 14)(1, 2, 12)(1, 3, 9 )(3, 1, -3)(3, 5, 14)(4, 3, 24)(5, 2, 18)(6, 1, 15)(6, 4, -7)11 22col q1234 p1234521.
42、 設置轉置后矩陣設置轉置后矩陣B的行數、列數和非零元個數;的行數、列數和非零元個數;2. 在在B中設置初始存儲位置中設置初始存儲位置pb;3. for (col=最小列號最小列號; col=最大列號最大列號; col+) 3.1 在在A中查找列號為中查找列號為col的三元組;的三元組; 3.2 交換其行號和列號,存入交換其行號和列號,存入B中中pb位置;位置; 3.3 pb+;算法算法 壓縮轉置壓縮轉置偽代碼偽代碼三、稀疏矩陣的轉置操作三、稀疏矩陣的轉置操作53Status TransPoseSMatrix ( TSMatrix M, TSMatrix &T)T.mu=M.nu; T.
43、nu=M.mu; T.tu=M.tu; if (T.tu) q=1; for(col=1; col=M.nu; 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.value=M.datap.value; q+; return OK; /TranposeSMatrix;壓縮轉置算法描述壓縮轉置算法描述:(見教材(見教材P99)/用三元組表存放稀疏矩陣用三元組表存放稀疏矩陣M M,求,求M的轉置矩陣的轉置矩陣T/q是轉置矩陣是轉置矩陣T T的結點編號的結點編
44、號/col是掃描是掃描M三元表列序的變量三元表列序的變量/p是是M三元表中結點編號三元表中結點編號541、主要時間消耗主要時間消耗在查找在查找M.datap.j=col的元素的元素,由兩重循環,由兩重循環完成完成: : for(col=1; col=M.nu; col+) 循環次數循環次數nu for(p=1; p=M.tu; p+) 循環次數循環次數tu所以該算法的時間復雜度為所以該算法的時間復雜度為O(O(nu*tu) ) - -即即M的列數與的列數與M中非零元素的個數中非零元素的個數之積之積最惡劣情況:最惡劣情況:M M中全是非零元素,此時中全是非零元素,此時tu=mu*nu, 時間復雜
45、度為時間復雜度為 O(O(nu2*mu ) )注:注:若若M M中基本上是非零元素時,即使用非壓縮傳統轉置算法中基本上是非零元素時,即使用非壓縮傳統轉置算法的時間復雜度也不過是的時間復雜度也不過是O(O(nu*mu) ) (程序見(程序見教材教材P99P99)結論:結論:壓縮轉置算法不能濫用。壓縮轉置算法不能濫用。前提:前提:僅適用于非零元素個數很少(即僅適用于非零元素個數很少(即tumu*nu)的情況。)的情況。壓縮轉置算法的效率分析壓縮轉置算法的效率分析:55分析:分析:A中第中第0列的第一個非零元素一定存儲在列的第一個非零元素一定存儲在B中下中下標為標為0的位置上,該列中其它非零元素應存
46、放在的位置上,該列中其它非零元素應存放在B中中后面連續的位置上,那么第后面連續的位置上,那么第1列的第一個非零元素在列的第一個非零元素在B中的位置便等于第中的位置便等于第0列的第一個非零元素在列的第一個非零元素在B中的位中的位置加上第置加上第0列的非零元素的個數,以此類推。列的非零元素的個數,以此類推。 基本思想:基本思想:順序取,直接存。順序取,直接存。即即在在A中依次取三元中依次取三元組,交換其行號和列號放到組,交換其行號和列號放到B 中中適當適當位置。位置。算法算法 快速轉置快速轉置如何確定當前從如何確定當前從A中取出的三元組在中取出的三元組在B中的位置?中的位置?三、稀疏矩陣的轉置操作
47、三、稀疏矩陣的轉置操作56方法方法2 2 快速轉置快速轉置三三元元組組表表a.data三三元元組組表表b.data(1, 3, -3)(2 ,1,12)(2, 5, 18)(3, 1, 9)(4, 6, -7)(5, 3, 14)(1, 6, 15)(3, 4, 24)(1, 2, 12)(1, 3, 9 )(3, 1, -3)(3, 5, 14)(4, 3, 24)(5, 2, 18)(6, 1, 15)(6, 4, -7)思路:依次思路:依次把把a.data中的元素直接送入中的元素直接送入b.data的恰當位置的恰當位置上(上(即即M M三元組的三元組的p p指針不回溯指針不回溯)。)。關
48、鍵:關鍵:怎樣尋找怎樣尋找b.data的的“恰當恰當”位置?位置? p1234 q 3 557引入兩個數組作為輔助數據結構:引入兩個數組作為輔助數據結構:numnu:存儲矩陣存儲矩陣A中某列的非零元素的個數;中某列的非零元素的個數;cpotnu:初值表示矩陣初值表示矩陣A中某列的第一個非零元素中某列的第一個非零元素在在B中的位置。中的位置。 數據結構設計:數據結構設計:cpot0=0;cpotcol=cpotcol- -1+numcol- -1; 1colnunum與與cpot存在如下遞推關系:存在如下遞推關系:算法算法 快速轉置快速轉置三、稀疏矩陣的轉置操作三、稀疏矩陣的轉置操作58如果能如
49、果能預知預知M矩陣矩陣每一列每一列( (即即T的每一行的每一行) )的的非零元素個數非零元素個數,又,又能預知能預知第一個非零元素第一個非零元素在在b.datab.data中的中的位置位置, ,則掃描則掃描a.data時便時便可以將每個元素準確定位(可以將每個元素準確定位(因為已知若干參考點因為已知若干參考點)。)。技巧:技巧:利用利用帶輔助向量帶輔助向量的三元組表,它正好攜帶每行(或列)的三元組表,它正好攜帶每行(或列)的非零元素個數的非零元素個數 NUM(i)以及每行(或列)的第一個非以及每行(或列)的第一個非零元素在三元組表中的位置零元素在三元組表中的位置POS(i) 等信息。等信息。設
50、計思路:設計思路:i123456NUM(i)202112POS( i )133567不過我們需要的是不過我們需要的是按列生成的按列生成的M矩陣的輔助向量。矩陣的輔助向量。規律:規律:POS(1)1POS(i)POS(i-1)+NUM(i-1)請回憶:請回憶:請注意請注意a.data特征:每列首個非零元素必定先被掃描到。特征:每列首個非零元素必定先被掃描到。59令:令:M中的列變量用中的列變量用col表示;表示; num col :存放存放M中第中第col 列中非列中非0 0元素個數,元素個數, cpot col :存放存放M中第中第col列的第一個非列的第一個非0 0元素的位置,元素的位置,
51、(即即b.data中待計算的中待計算的“恰當恰當”位置所需參考點位置所需參考點)討論:討論:按列優先的輔助向量求出后,按列優先的輔助向量求出后,下一步該如何操作?下一步該如何操作?由由a.dataa.data中每個元素的列信息,即可直接查出中每個元素的列信息,即可直接查出b.datab.data中的中的重要參考點之位置,進而可確定當前元素之位置!重要參考點之位置,進而可確定當前元素之位置!col123456numcol222110cpotcol1規律:規律: cpot(1)1 cpotcol cpotcol-1 + numcol-10 12 9 0 0 00 0 0 0 0 0-3 0 0 0
52、 14 00 0 24 0 0 00 18 0 0 0 015 0 0 -7 0 0M 3 5 7 8 8col 1 2 3 4 5 6601. 設置轉置后矩陣設置轉置后矩陣B的行數、列數和非零元素的個數;的行數、列數和非零元素的個數;2. 計算計算A中每一列的非零元素個數;中每一列的非零元素個數;3. 計算計算A中每一列的第一個非零元素在中每一列的第一個非零元素在B中的下標;中的下標;4. 依次取依次取A中的每一個非零元素對應的三元組;中的每一個非零元素對應的三元組; 4.1 確定該元素在確定該元素在B中的下標中的下標pb; 4.2 將該元素的行號列號交換后存入將該元素的行號列號交換后存入B
53、中中pb的位置;的位置; 4.3 預置該元素所在列的下一個元素的存放位置;預置該元素所在列的下一個元素的存放位置;算法算法 快速轉置快速轉置偽代碼偽代碼三、稀疏矩陣的轉置操作三、稀疏矩陣的轉置操作61Status FastTransposeSMatrix(TSMatirx M, TSMatirx &T) T.mu = M.nu ;T .nu = M.mu ; T.tu = M.tu ; if ( T.tu ) for(col = 1; col =M.nu; col+) numcol =0; for( i = 1; i =M.tu; i +) col =M.data i .j ; +nu
54、m col ; cpos 1 =1; for(col = 2; col =M.nu; col+) cposcol =cposcol-1+num col-1 ; for( p =1; p =M.tu ; p + ) col =M.data p . j ; q =cpos col ; T.dataq.i = M.datap. j; T.dataq.j = M.datap. i; T.dataq. value = M.datap. value; /for /ifreturn OK; /FastTranposeSMatrix;快速轉置算法描述快速轉置算法描述:/M用順序存儲表示,求用順序存儲表示,求M
55、的轉置矩陣的轉置矩陣T/初始化初始化M中各列元素個數為中各列元素個數為0/再生成每列首元位置輔助向量表再生成每列首元位置輔助向量表/p指向指向a.data,循環次數為非,循環次數為非0元素總個數元素總個數tu/查輔助向量表得查輔助向量表得q,即,即T中位置中位置/重要語句!重要語句!修改向量表中列坐標值,供修改向量表中列坐標值,供同同一列一列下一非零元素定位之用!下一非零元素定位之用!621. 與常規算法相比,附加了生成輔助向量表的工作。增開了與常規算法相比,附加了生成輔助向量表的工作。增開了2個長度為列長的數組個長度為列長的數組( (num 和和cpos )。 傳統轉置:傳統轉置:O( mu
56、*nu) 壓縮轉置:壓縮轉置:O ( mu*tu) 壓縮快速轉置:壓縮快速轉置:O( nu+tu)犧牲空間效率換時間效率犧牲空間效率換時間效率??焖俎D置算法的效率分析快速轉置算法的效率分析:2. 從時間上,此算法用了從時間上,此算法用了4個并列的單循環個并列的單循環,而且其中前,而且其中前3個單個單循環都是用來產生輔助向量表的。循環都是用來產生輔助向量表的。 for(col = 1; col =M.nu; col+) 循環次數循環次數nu;nu; for( i = 1; i =M.tu; i +) 循環次數循環次數tu;tu; for(col = 2; col =M.nu; col+) 循環次
57、數循環次數nu;nu; for( p =1; p =M.tu ; p + ) 循環次數循環次數tu;tu; 該算法的時間復雜度該算法的時間復雜度(nu*2)+(tu*2)=O (nu+tu)討論:討論:最惡劣情況是最惡劣情況是tu=nu*mu( (即矩陣中全部是非零元素),即矩陣中全部是非零元素),而此時的時間復雜度也只是而此時的時間復雜度也只是O(mu*nu),并未超過傳統轉置算法,并未超過傳統轉置算法的時間復雜度。的時間復雜度。小結:小結:稀疏矩陣相乘的算法見教材稀疏矩陣相乘的算法見教材P101-103635.4 廣義表的定義廣義表的定義廣義表是線性表的推廣,也稱為列表(廣義表是線性表的推廣,也稱為列表(lists)記為:記為: LS = ( a1 , a2 , , an ) 廣義表名廣義表名1. 定義:定義: 第一個元素是表頭,而其余元素第一個元素是表頭,而其余元素組成的表組成的表稱為表尾;稱為表尾; 用用小寫小寫字母表示字母表示原子類型原子類型,用,用大寫大寫字母表示字母表示列表列表。n是表長是表長在廣義表中約定:在廣義表中約定:討論:討論:廣義表與線性表的區別和聯系?廣義表與線性表的區別和聯系? 廣義表中元素廣義表中元素既可以既可以是原子類型,是原子類型,也可以也可以是列表;是列表;當每個元素都為原子且類型相同時,就是線性表。當每個元素都為原子
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45755-2025纖維增強復合材料板材拉擠成型模
- GB/T 3241.2-2025電聲學倍頻程和分數倍頻程濾波器第2部分:型式評價試驗
- 蜜餞制作與水果加工副產物研發考核試卷
- 靈活可變包裝考核試卷
- 銀冶煉與循環經濟考核試卷
- 羊的飼養羔羊飼養關鍵技術考核試卷
- 兒童口腔功能式矯治器
- 新生兒危重癥護理
- 呼吸機消毒與保養規范
- 呼氣性呼吸困難
- 糖尿病外周血管病變和糖尿病足培訓課件
- 2022年N2觀光車和觀光列車司機考試技巧及N2觀光車和觀光列車司機考試試題
- 使市場在資源配置中起決定性作用 課件【新教材備課精講精研】高中政治統編版必修二經濟與社會
- SB/T 10279-2017熏煮香腸
- GB/T 6185.2-20162型全金屬六角鎖緊螺母細牙
- GA/T 1394-2017信息安全技術運維安全管理產品安全技術要求
- IB教育中的PYP介紹專題培訓課件
- 2022年桂林市衛生學校教師招聘筆試題庫及答案解析
- 欄桿安裝單元工程施工質量驗收評定表完整
- 外墻清洗服務工程項目進度保障計劃
- 2×300MW火電廠電氣一次部分設計
評論
0/150
提交評論