




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)數(shù)組和廣義表1第一頁,共五十三頁,2022年,8月28日5.1數(shù)組的定義
數(shù)組:由一組名字相同、下標(biāo)不同的變量構(gòu)成注意:本章所討論的數(shù)組與高級(jí)語言中的數(shù)組有所區(qū)別:高級(jí)語言中的數(shù)組是順序結(jié)構(gòu);而本章的數(shù)組既可以是順序的,也可以是鏈?zhǔn)浇Y(jié)構(gòu),用戶可根據(jù)需要選擇。答:對(duì)的。因?yàn)椋孩贁?shù)組中各元素具有統(tǒng)一的類型;②數(shù)組元素的下標(biāo)一般具有固定的上界和下界,即數(shù)組一旦被定義,它的維數(shù)和維界就不再改變。③數(shù)組的基本操作比較簡單,除了結(jié)構(gòu)的初始化和銷毀之外,只有存取元素和修改元素值的操作。討論:“數(shù)組的處理比其它復(fù)雜的結(jié)構(gòu)要簡單”,對(duì)嗎?2第二頁,共五十三頁,2022年,8月28日二維數(shù)組的特點(diǎn):一維數(shù)組的特點(diǎn):1個(gè)下標(biāo),ai是ai+1的直接前驅(qū)2個(gè)下標(biāo),每個(gè)元素ai,j受到兩個(gè)關(guān)系(行關(guān)系和列關(guān)系)的約束:一個(gè)m×n的二維數(shù)組可以看成是m行的一維數(shù)組,或者n列的一維數(shù)組。N維數(shù)組的特點(diǎn):n個(gè)下標(biāo),每個(gè)元素受到n個(gè)關(guān)系約束一個(gè)n維數(shù)組可以看成是由若干個(gè)n-1維數(shù)組組成的線性表。a11a12…a1n
a21a22…a2n
…………
am1am2…amn
Amn=3第三頁,共五十三頁,2022年,8月28日N維數(shù)組的數(shù)據(jù)類型定義n_ARRAY=(D,R)其中:Ri={<aj1,j2,…ji…jn,aj1,j2,…ji+1…jn
>|
aj1,j2,…ji…jn,aj1,j2,…ji+1…jn
D}數(shù)據(jù)關(guān)系:R={R1,R2,….Rn}數(shù)據(jù)對(duì)象:D={aj1,j2…jn|ji為數(shù)組元素的第i維下標(biāo),aj1,j2…jn
Elemset}數(shù)組的抽象數(shù)據(jù)類型定義略,參見教材P90構(gòu)造數(shù)組、銷毀數(shù)組、讀數(shù)組元素、寫數(shù)組元素基本操作:4第四頁,共五十三頁,2022年,8月28日5.2數(shù)組的順序存儲(chǔ)表示和實(shí)現(xiàn)問題:計(jì)算機(jī)的存儲(chǔ)結(jié)構(gòu)是一維的,而數(shù)組一般是多維的,怎樣存放?解決辦法:事先約定按某種次序?qū)?shù)組元素排成一列序列,然后將這個(gè)線性序列存入存儲(chǔ)器中。例如:在二維數(shù)組中,我們既可以規(guī)定按行存儲(chǔ),也可以規(guī)定按列存儲(chǔ)。注意:若規(guī)定好了次序,則數(shù)組中任意一個(gè)元素的存放地址便有規(guī)律可尋,可形成地址計(jì)算公式;約定的次序不同,則計(jì)算元素地址的公式也有所不同;C和PASCAL中一般采用行優(yōu)先順序;FORTRAN采用列優(yōu)先。5第五頁,共五十三頁,2022年,8月28日補(bǔ)充:計(jì)算二維數(shù)組元素地址的通式
設(shè)一般的二維數(shù)組是A[c1..d1,c2..d2],這里c1,c2不一定是0。無論規(guī)定行優(yōu)先或列優(yōu)先,只要知道以下三要素便可隨時(shí)求出任一元素的地址(這樣數(shù)組中的任一元素便可以隨機(jī)存取?。憾S數(shù)組列優(yōu)先存儲(chǔ)的通式為:LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*Lac1,c2…ac1,d2…aij…
ad1,c2…ad1,d2
Amn=單個(gè)元素長度aij之前的行數(shù)數(shù)組基址總列數(shù),即第2維長度aij本行前面的元素個(gè)數(shù)①開始結(jié)點(diǎn)的存放地址(即基地址)②維數(shù)和每維的上、下界;③每個(gè)數(shù)組元素所占用的單元數(shù)則行優(yōu)先存儲(chǔ)時(shí)的地址公式為:
LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L6第六頁,共五十三頁,2022年,8月28日例2:已知二維數(shù)組Am,m按行存儲(chǔ)的元素地址公式是:
Loc(aij)=Loc(a11)+[(i-1)*m+(j-1)]*K,按列存儲(chǔ)的公式是?Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K(盡管是方陣,但公式仍不同)例1〖軟考題〗:一個(gè)二維數(shù)組A,行下標(biāo)的范圍是1到6,列下標(biāo)的范圍是0到7,每個(gè)數(shù)組元素用相鄰的6個(gè)字節(jié)存儲(chǔ),存儲(chǔ)器按字節(jié)編址。那么,這個(gè)數(shù)組的體積是
個(gè)字節(jié)。288例3:〖00年計(jì)算機(jī)系考研題〗設(shè)數(shù)組a[1…60,1…70]的基地址為2048,每個(gè)元素占2個(gè)存儲(chǔ)單元,若以列序?yàn)橹餍蝽樞虼鎯?chǔ),則元素a[32,58]的存儲(chǔ)地址為
。8950LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950答:請(qǐng)注意審題!利用列優(yōu)先通式:答:Volume=m*n*L=(6-1+1)*(7-0+1)*6=48*6=2887第七頁,共五十三頁,2022年,8月28日Loc(j1,j2,…jn)=LOC(0,0,…0)+若是N維數(shù)組,其中任一元素的地址該如何計(jì)算?其中Cn=L,Ci-1=bi×Ci,1<i≤n一個(gè)元素長度數(shù)組基址前面若干元素占用的地址字節(jié)總數(shù)第i維長度與所存元素個(gè)數(shù)有關(guān)的系數(shù),可用遞推法求出教材已給出低維優(yōu)先的地址計(jì)算公式,見P93(5-2)式該式稱為n維數(shù)組的映像函數(shù):8第八頁,共五十三頁,2022年,8月28日#defineMAX_ARRAY_DIM8//假設(shè)最大維數(shù)為8typedefstruct{ELemType*base;//數(shù)組元素基址intdim;//數(shù)組維數(shù)int*bound;//數(shù)組各維長度信息保存區(qū)基址int*constants;//數(shù)組映像函數(shù)常量的基址}Array;即Ci信息保存區(qū)數(shù)組的基本操作函數(shù)說明(有5個(gè))(請(qǐng)閱讀教材P93-95)N維數(shù)組的順序存儲(chǔ)表示(見教材P93)9第九頁,共五十三頁,2022年,8月28日StatusInitArray(Array&A,intdim,…){//若維數(shù)dim和各維長度合法,則構(gòu)造相應(yīng)的數(shù)組A并返回OKif(dim<1||dim>MAX_ARRAY_DIM)returnERROR;A.dim=dim;A.bounds=(int*)malloc(dim*sizeof(int));if(!a.bounds)exit(OVERFLOW);
//若各維長度合法,則存入A.bounds,并求出A的元素總數(shù)elemtotalelemtotal=1;va_start(ap.dim);//ap為va_list類型,是存放變長參數(shù)表信息的類型數(shù)組的基本操作函數(shù)說明(5個(gè))(見教材P93-95)10第十頁,共五十三頁,2022年,8月28日for(i=0;i<dim;++i){A.bounds[i]=va_arg(ap,int);if(A.bounds[i]<0)returnUNDERFLOW;
elemtotal*=A.bounds[i];}va_end(ap);A.base=(ElemType*)malloc(elemtotal*sizeof(ElemType));if(!A.base)exit(OVERFLOW);A.constants=(int*)malloc(dim*sizeof(int));if(!A.constans)exit(OVERFLOW);A.constans[dim-1]=1;for(i=dim-2;i>=0;--i)A.constants[i]=A.bounds[i+1]*A.constants[i+1];returnOK;}11第十一頁,共五十三頁,2022年,8月28日數(shù)組基址指針各維長度保存區(qū)指針映像函數(shù)Ci保存區(qū)指針StatusDestroyArray(Array&A){//銷毀數(shù)組Aif(!A.base)returnERROR;
free(A.base);A.base=NULL;if(!A.bounds)returnERROR;
free(A.bounds);A.bounds=NULL;if(!A.constants)returnERROR;
free(A.constants);A.constants=NULL;returnOK;}12第十二頁,共五十三頁,2022年,8月28日StatusLocate(ArrayA,va_listap,int&off){
//若ap指示的各下標(biāo)值合法,則求出該元素在A中,相對(duì)地址offoff=0;for(i=0;i<A.dim;++i){ind=va_arg(ap,int);if(ind<0||ind>A.bounds[i])returnOVERFLOW;off+=A.constants[i]*ind;}returnOK;}13第十三頁,共五十三頁,2022年,8月28日StatusValue(ArrayA,ElemType&e,…){
//A是n維數(shù)組,e為元素變量,隨后是n個(gè)下標(biāo)值,若各下標(biāo)不超界,則e賦值為所指定的A的元素值,即將指定元素值讀到e變量中。va_start(ap,e);if((result=Locate(A,ap,off))<=0)returnresult;e=*(A.base+off);returnOK;}14第十四頁,共五十三頁,2022年,8月28日StatusAssign(Array&A,ElemTypee,…){
//A是n維數(shù)組,e為元素變量,隨后是n個(gè)下標(biāo)值,若各下標(biāo)不超界,則e的值賦為所指定的A的元素值,即:將e值寫入指定數(shù)組單元。va_start(ap,e);if((result=Locate(A,ap,off))<=0)returnresult;*(A.base+off)=e;returnOK;}15第十五頁,共五十三頁,2022年,8月28日順序存儲(chǔ)方式:按低地址優(yōu)先(或高地址優(yōu)先)順序存入一維數(shù)組。^……行指針向量a11a12…^a1nam1am2…^amn補(bǔ)充:
鏈?zhǔn)酱鎯?chǔ)方式:用帶行指針向量的單鏈表來表示。注:數(shù)組的運(yùn)算參見下一節(jié)實(shí)例(稀疏矩陣的轉(zhuǎn)置)(難點(diǎn)是多維數(shù)組與一維數(shù)組的地址映射關(guān)系)16第十六頁,共五十三頁,2022年,8月28日5.3矩陣的壓縮存儲(chǔ)討論:1.什么是壓縮存儲(chǔ)?若多個(gè)數(shù)據(jù)元素的值都相同,則只分配一個(gè)元素值的存儲(chǔ)空間,且零元素不占存儲(chǔ)空間。2.所有二維數(shù)組(矩陣)都能壓縮嗎?未必,要看矩陣是否具備以上壓縮條件。3.什么樣的矩陣具備以上壓縮條件?
一些特殊矩陣,如:對(duì)稱矩陣,對(duì)角矩陣,三角矩陣,稀疏矩陣等。4.什么叫稀疏矩陣?矩陣中非零元素的個(gè)數(shù)較少(一般小于5%)重點(diǎn)介紹稀疏矩陣的壓縮和相應(yīng)的操作。17第十七頁,共五十三頁,2022年,8月28日例:對(duì)稱矩陣的壓縮存儲(chǔ)設(shè)有一個(gè)nn的對(duì)稱矩陣A。在矩陣中,aij
=aji18第十八頁,共五十三頁,2022年,8月28日為節(jié)約存儲(chǔ),只存對(duì)角線及對(duì)角線以上的元素,或者只存對(duì)角線及對(duì)角線以下的元素。前者稱為上三角矩陣,后者稱為下三角矩陣。下三角矩陣19第十九頁,共五十三頁,2022年,8月28日上三角矩陣把它們按行存放于一個(gè)一維數(shù)組B中,稱之為對(duì)稱矩陣A的壓縮存儲(chǔ)方式。數(shù)組B共有n+(n-1)++1=
n*(n+1)/2個(gè)元素。20第二十頁,共五十三頁,2022年,8月28日下三角矩陣Ba11a21a22a31a32a33a41a42a43……
ann
012345678n(n+1)/2-1若
i
j,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為1+2++(i-1)+(j-1)=(i-1)*i/2+j-1前i行元素總數(shù)第i行第j個(gè)元素前元素個(gè)數(shù)21第二十一頁,共五十三頁,2022年,8月28日若i<j,數(shù)組元素A[i][j]在矩陣的上三角部分,在數(shù)組B中沒有存放,可以找它的對(duì)稱元素A[j][i]
一維數(shù)組B中的數(shù)據(jù)元素和方陣A中的元素之間存在著下列一一對(duì)應(yīng)的關(guān)系
22第二十二頁,共五十三頁,2022年,8月28日上三角矩陣Ba11a12a13a14a22a23a24a33a34
a44
0123456789若i
j,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為 n+(n-1)+(n-2)++(n-i+1)+j-i前i行元素總數(shù)第i行第j個(gè)元素前元素個(gè)數(shù)n=423第二十三頁,共五十三頁,2022年,8月28日
若i
j,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為
n+(n-1)+(n-2)++(n-i+1)+j-i==(2*n-i+1)*i/2+j-i==(2*n-i-1)*i/2+j若i>j,數(shù)組元素A[i][j]在矩陣的下三角部分,在數(shù)組B中沒有存放。因此,找它的對(duì)稱元素A[j][i]。A[j][i]在數(shù)組B的第(2*n-j-1)*j/2+i的位置中找到。24第二十四頁,共五十三頁,2022年,8月28日5.3.2稀疏矩陣問題:如果只存儲(chǔ)稀疏矩陣中的非零元素,那這些元素的位置信息該如何表示?解決思路:對(duì)每個(gè)非零元素增開若干存儲(chǔ)單元,例如存放其所在的行號(hào)和列號(hào),便可準(zhǔn)確反映該元素所在位置。實(shí)現(xiàn)方法:將每個(gè)非零元素用一個(gè)三元組(i,j,aij)來表示,則每個(gè)稀疏矩陣可用一個(gè)三元組表來表示。問題:稀疏矩陣的存儲(chǔ)和操作?25第二十五頁,共五十三頁,2022年,8月28日例1:三元素組表中的每個(gè)結(jié)點(diǎn)對(duì)應(yīng)于稀疏矩陣的一個(gè)非零元素,它包含有三個(gè)數(shù)據(jù)項(xiàng),分別表示該元素的
、
和
。行下標(biāo)列下標(biāo)元素值例2:寫出右圖所示稀疏矩陣的壓縮存儲(chǔ)形式。0
1290000
00000-30001400
0240000
18000015
00-700((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:用線性表表示:0
1290000
00000-30001400
024
0000
18000015
00-700(6,6)26第二十六頁,共五十三頁,2022年,8月28日法2:用三元組順序表表示:P.980
1290000
00000-30001400
024
0000
18000015
00-700121213931-3351443245218611564-7注意:為更可靠描述,通常再加一行“總體”信息:即總行數(shù)、總列數(shù)、非零元素總個(gè)數(shù)668ijvalue稀疏矩陣壓縮存儲(chǔ)的缺點(diǎn):將失去隨機(jī)存取功能:-(01234567827第二十七頁,共五十三頁,2022年,8月28日#defineMAXSIZE125000//設(shè)非零元素最大個(gè)數(shù)125000typedefstruct{inti;//元素行號(hào)intj;//元素列號(hào)ElemTypee;//元素值}Triple;typedefstruct{
Tripledata[MAXSIZE+1];//三元組表,以行為主序存入一維向量data[]中intmu;//矩陣總行數(shù)intnu;//矩陣總列數(shù)inttu;//矩陣中非零元素總個(gè)數(shù)}TsMatrix;三元組表的順序存儲(chǔ)表示(見教材P98)://一個(gè)結(jié)點(diǎn)的結(jié)構(gòu)定義//整個(gè)三元組表的定義28第二十八頁,共五十三頁,2022年,8月28日法三:用帶輔助向量的三元組表示。方法:增加1個(gè)輔助向量:記錄稀疏矩陣中每行第一個(gè)非0元素在三元組中的行號(hào),用POS(i)表示。76531211202NUM(i)6543POS(
i)21i0
1290000
00000-30001400
024
0000
18000015
00-700-7461516182524341453-3139311221866vji0123456783用途:通過三元組高效訪問稀疏矩陣中任一非零元素。規(guī)律:POS(1)=1POS(i)=POS(i-1)+NUM(i-1)注:書上稱為行邏輯鏈接的三元組順序表。教材P10029第二十九頁,共五十三頁,2022年,8月28日行邏輯鏈接的三元組順序表的結(jié)構(gòu)定義typedefstruct{Tripledata[MAXSIZE+1];/*非零元三元組表,data[0]未用*/intrpos[MAXRC+1];/*各行第一個(gè)非零元素的位置表*/intmu,nu,tu;/*矩陣的行數(shù)、列數(shù)和非零元個(gè)數(shù)*/}RLSMatrix;30第三十頁,共五十三頁,2022年,8月28日法四:用十字鏈表表示教材P100用途:方便稀疏矩陣的加減運(yùn)算;方法:每個(gè)非0元素占用5個(gè)域。rightdownvji同一列中下一非零元素的指針同一行中下一非零元素的指針十字鏈表的特點(diǎn):①每行非零元素鏈接成帶表頭結(jié)點(diǎn)的循環(huán)鏈表;②每列非零元素也鏈接成帶表頭結(jié)點(diǎn)的循環(huán)鏈表。則每個(gè)非零元素既是行循環(huán)鏈表中的一個(gè)結(jié)點(diǎn);又是列循環(huán)鏈表中的一個(gè)結(jié)點(diǎn),即呈十字鏈狀。31第三十一頁,共五十三頁,2022年,8月28日稀疏矩陣的十字鏈表存儲(chǔ)表示typedefstructOLNode{inti,j;/*該非零元的行和列下標(biāo)*/ElemTypee;/*非零元素值*/structOLNode*right,*down;/*該非零元所在行表和列表的后繼鏈域*/}OLNode,*OLink;typedefstruct{OLink*rhead,*chead;/*行和列鏈表頭指針向量基址,由CreatSMatrix_OL()分配*/intmu,nu,tu;/*稀疏矩陣的行數(shù)、列數(shù)和非零元個(gè)數(shù)*/}CrossList;32第三十二頁,共五十三頁,2022年,8月28日十字鏈表表示稀疏矩陣實(shí)例33第三十三頁,共五十三頁,2022年,8月28日二、稀疏矩陣的操作
0
12
90000
00000-30001400
0240000
18000015
00-7000
0–3001512
000180
90024000
0000-70
0140000
00000(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轉(zhuǎn)置后MT(以轉(zhuǎn)置運(yùn)算為例)目的:34第三十四頁,共五十三頁,2022年,8月28日答:肯定不正確!除了:(1)每個(gè)元素的行下標(biāo)和列下標(biāo)互換(即三元組中的i和j互換);還應(yīng)該:(2)T的總行數(shù)mu和總列數(shù)nu與M值不同(互換);(3)重排三元組內(nèi)元素順序,使轉(zhuǎn)置后的三元組也按行(或列)為主序有規(guī)律的排列。上述(1)和(2)容易實(shí)現(xiàn),難點(diǎn)在(3)。若采用三元組壓縮技術(shù)存儲(chǔ)稀疏矩陣,只要把每個(gè)元素的行下標(biāo)和列下標(biāo)互換,就完成了對(duì)該矩陣的轉(zhuǎn)置運(yùn)算,這種說法正確嗎?有兩種實(shí)現(xiàn)方法壓縮轉(zhuǎn)置(壓縮)快速轉(zhuǎn)置提問:35第三十五頁,共五十三頁,2022年,8月28日方法1:壓縮轉(zhuǎn)置思路:反復(fù)掃描a.data中的列序,從小到大依次進(jìn)行轉(zhuǎn)置。三元組表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)1122colq1234p123436第三十六頁,共五十三頁,2022年,8月28日StatusTransPoseSMatrix(TSMatrixM,TSMatrix&T){T.mu=M.nu;T.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.data[p].j==col){T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].value=M.data[p].value;q++;}}}
}returnOK;}//TranposeSMatrix;壓縮轉(zhuǎn)置算法描述:(見教材P99)//用三元組表存放稀疏矩陣M,求M的轉(zhuǎn)置矩陣T//q是轉(zhuǎn)置矩陣T的結(jié)點(diǎn)編號(hào)//col是掃描M三元表列序的變量//p是M三元表中結(jié)點(diǎn)編號(hào)37第三十七頁,共五十三頁,2022年,8月28日1、主要時(shí)間消耗在查找M.data[p].j=col的元素,由兩重循環(huán)完成:for(col=1;col<=M.nu;col++)循環(huán)次數(shù)=nu
{for(p=1;p<=M.tu;p++)循環(huán)次數(shù)=tu所以該算法的時(shí)間復(fù)雜度為O(nu*tu)----即M的列數(shù)與M中非零元素的個(gè)數(shù)之積最惡劣情況:M中全是非零元素,此時(shí)tu=mu*nu,時(shí)間復(fù)雜度為O(nu2*mu)注:若M中基本上是非零元素時(shí),即使用非壓縮傳統(tǒng)轉(zhuǎn)置算法的時(shí)間復(fù)雜度也不過是O(nu*mu)(程序見教材P99)結(jié)論:壓縮轉(zhuǎn)置算法不能濫用。前提:僅適用于非零元素個(gè)數(shù)很少(即tu<<mu*nu)的情況。壓縮轉(zhuǎn)置算法的效率分析:38第三十八頁,共五十三頁,2022年,8月28日方法2
快速轉(zhuǎn)置三元組表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(bǔ).data中的元素直接送入b.data的恰當(dāng)位置上(即M三元組的p指針不回溯)。關(guān)鍵:怎樣尋找b.data的“恰當(dāng)”位置?p1234q3539第三十九頁,共五十三頁,2022年,8月28日如果能預(yù)知M矩陣每一列(即T的每一行)的非零元素個(gè)數(shù),又能預(yù)知第一個(gè)非零元素在b.data中的位置,則掃描a.data時(shí)便可以將每個(gè)元素準(zhǔn)確定位(因?yàn)橐阎舾蓞⒖键c(diǎn))。技巧:利用帶輔助向量的三元組表,它正好攜帶每行(或列)的非零元素個(gè)數(shù)NUM(i)以及每行(或列)的第一個(gè)非零元素在三元組表中的位置POS(i)等信息。設(shè)計(jì)思路:i123456NUM(i)202112POS(i)133567不過我們需要的是按列生成的M矩陣的輔助向量。規(guī)律:POS(1)=1POS(i)=POS(i-1)+NUM(i-1)請(qǐng)回憶:請(qǐng)注意a.data特征:每列首個(gè)非零元素必定先被掃描到。40第四十頁,共五十三頁,2022年,8月28日令:M中的列變量用col表示;
num[col]:存放M中第col列中非0元素個(gè)數(shù),
cpot[col]:存放M中第col列的第一個(gè)非0元素的位置,
(即b.data中待計(jì)算的“恰當(dāng)”位置所需參考點(diǎn))討論:按列優(yōu)先的輔助向量求出后,下一步該如何操作?由a.data中每個(gè)元素的列信息,即可直接查出b.data中的重要參考點(diǎn)之位置,進(jìn)而可確定當(dāng)前元素之位置!col123456num[col]222110cpot[col]1規(guī)律:cpot(1)=1cpot[col]=
cpot[col-1]+num[col-1]0
12
90000
00000-30001400
0240000
18000015
00-700M35788col12345641第四十一頁,共五十三頁,2022年,8月28日StatusFastTransposeSMatrix(TSMatirxM,TSMatirx&T){T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu){for(col=1;col<=M.nu;col++)num[col]=0;for(i=1;i<=M.tu;i++){col=M.data[i].j;++num[col];}
cpos[1]=1;for(col=2;col<=M.nu;col++)cpos[col]=cpos[col-1]+num[col-1];for(p=1;p<=M.tu;p++)
{
col=M.data[p].j;q=cpos[col];T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].value=M.data[p].value;
++cpos[col];}
//for}//ifreturnOK;}//FastTranposeSMatrix;快速轉(zhuǎn)置算法描述://M用順序存儲(chǔ)表示,求M的轉(zhuǎn)置矩陣T//先統(tǒng)計(jì)每列非零元素個(gè)數(shù)//再生成每列首元位置輔助向量表//p指向a.data,循環(huán)次數(shù)為非0元素總個(gè)數(shù)tu//查輔助向量表得q,即T中位置//重要語句!修改向量表中列坐標(biāo)值,供同一列下一非零元素定位之用!42第四十二頁,共五十三頁,2022年,8月28日1.與常規(guī)算法相比,附加了生成輔助向量表的工作。增開了2個(gè)長度為列長的數(shù)組(num[]和cpos[])。傳統(tǒng)轉(zhuǎn)置:O(mu*nu)壓縮轉(zhuǎn)置:O(mu*tu)壓縮快速轉(zhuǎn)置:O(nu+tu)——犧牲空間效率換時(shí)間效率。快速轉(zhuǎn)置算法的效率分析:2.從時(shí)間上,此算法用了4個(gè)并列的單循環(huán),而且其中前3個(gè)單循環(huán)都是用來產(chǎn)生輔助向量表的。for(col=1;col<=M.nu;col++)循環(huán)次數(shù)=nu;
for(i=1;i<=M.tu;i++)循環(huán)次數(shù)=tu;
for(col=2;col<=M.nu;col++)循環(huán)次數(shù)=nu;for(p=1;p<=M.tu;p++)循環(huán)次數(shù)=tu;
該算法的時(shí)間復(fù)雜度=(nu*2)+(tu*2)=O(nu+tu)討論:最惡劣情況是tu=nu*mu(即矩陣中全部是非零元素),而此時(shí)的時(shí)間復(fù)雜度也只是O(mu*nu),并未超過傳統(tǒng)轉(zhuǎn)置算法的時(shí)間復(fù)雜度。小結(jié):稀疏矩陣相乘的算法見教材P101-10343第四十三頁,共五十三頁,2022年,8月28日5.4廣義表的定義廣義表是線性表的推廣,也稱為列表(lists)記為:LS=(a1,a2,……,an)廣義表名表頭(Head)表尾(Tail)1、定義:①第一個(gè)元素是表頭,而其余元素組成的表稱為表尾;②用小寫字母表示原子類型,用大寫字母表示列表。n是表長在廣義表中約定:討論:廣義表與線性表的區(qū)別和聯(lián)系?廣義表中元素既可以是原子類型,也可以是列表;當(dāng)每個(gè)元素都為原子且類型相同時(shí),就是線性表。44第四十四頁,共五十三頁,2022年,8月28日2、特點(diǎn):有次序性有長度有深度可遞歸可共享一個(gè)直接前驅(qū)和一個(gè)直接后繼=表中元素個(gè)數(shù)=表中括號(hào)的重?cái)?shù)自己可以作為自己的子表可以為其他廣義表所共享特別提示:任何一個(gè)非空表,表頭可能是原子,也可能是列表;但表尾一定是列表。45第四十五頁,共五十三頁,2022年,8月28日E=(a,E)=(a,(a,E))=(a,(a,(a,…….))),E為遞歸表1)A=()2)B=(e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保理人合同范本
- 勞務(wù)派遣合同范本 司機(jī)
- 包工頭與臨時(shí)工人合同范本
- 勞務(wù)合同單包工合同范本
- 企業(yè)合同范本封面
- 勞務(wù)用工結(jié)算合同范本
- 單位采購書合同范本
- 醫(yī)院影像科合同范本
- 與商城簽約合同范本
- 鐵嶺鋼板搪瓷水箱施工方案
- GB/T 40417-2021電子特氣六氟丁二烯
- GB/T 39518-2020產(chǎn)品幾何技術(shù)規(guī)范(GPS)使用單探針和多探針接觸式探測系統(tǒng)坐標(biāo)測量機(jī)的檢測不確定度評(píng)估指南
- GB/T 34281-2017全民健身活動(dòng)中心分類配置要求
- GB/T 21941-2008土方機(jī)械液壓挖掘機(jī)和挖掘裝載機(jī)的反鏟斗和抓鏟斗容量標(biāo)定
- 學(xué)法減分真題題庫400道含答案(完整版駕照考試)
- 新教科版五下科學(xué)1.1《種子發(fā)芽實(shí)驗(yàn)》優(yōu)質(zhì)課件
- 哥達(dá)綱領(lǐng)批判(課件)
- 人教版三年級(jí)音樂下冊(cè)全冊(cè)課件匯總
- ommaya囊的護(hù)理教學(xué)課件
- NY∕T 3349-2021 畜禽屠宰加工人員崗位技能要求
- MA40系列智能型萬能式斷路器安裝及調(diào)試
評(píng)論
0/150
提交評(píng)論