專業課參考-數據結構_第1頁
專業課參考-數據結構_第2頁
專業課參考-數據結構_第3頁
專業課參考-數據結構_第4頁
專業課參考-數據結構_第5頁
免費預覽已結束,剩余41頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章數組與廣義表第2

頁5.1數組的概念數據類型相同的元素(變量)構成的有序元素的集合。數組名代表即為該集合的代表。如果要訪問其中某個元素(變量),可以通過元素的索引值(下標)訪問。C語言中數組元素的索引值從0開始。

intA[30][10];e=A[i][j];

intA[c1..d1,c2..d2]

更一般情況:子界第3

頁5.1數組的概念數組的邏輯結構 1.線性結構擴展AMN=a00a01…

a0N-1a10a11…

a1N-1aM-10aM-11…aM-1N-1

A=(A0,A1,…,AN-1)其中:Ai=(a0i,a1i,…,Am-1i)(0≤i≤N-1)二維數組是以數據元素作為線性表的線性表第4

頁5.1數組的概念數組的邏輯結構2.二維數組中的每個元素都受兩個線性關系的約束——行、列AMN=a00a01…

a0N-1a10a11…

a1N-1............aM-10aM-11…aM-1N-1在行關系中ai,j直接前趨ai,j-1ai,j直接后繼ai,j+1在列關系中ai,j直接前趨ai-1,jai,j直接后繼ai+1,jN維數組中的每個元素受N個線性關系的約束第5

頁5.1數組的概念數組的基本操作初始化操作InitArray(&A,n,bound1,…,boundn)銷毀操作DestroyArray(&A)讀元素操作Value(A,&e,index1,…,indexn)寫元素操作Assign(&A,e,index1,…,indexn)在高級語言中的典型體現:intA[M][N];A[i][j]=x;寫y=A[i][j];讀AMN=a00a01…

a0N-1a10a11…

a1N-1aM-10aM-11…aM-1N-1第6

頁5.1數組的概念數組的基本操作1. 讀:給定一組下標,讀出對應的數組元素;2. 寫:給定一組下標,存儲或修改與其相對應的數組元素。

讀/寫操作本質上只對應一種操作—尋址:確定指定元素在內存中的物理地址。數組的存儲 兩種形式:既可以是順序存儲,也可以采用鏈式結構。第7

頁5.2數組的存儲和實現數組的存儲結構與尋址——一維數組 設有M個元素的一維數組,下標范圍為閉區間[0,M-1],每個數組元素占用L

個存儲單元。La0ai-1ai……aM-1a1……Loc(a0)Loc(ai)

ai

的存儲地址:Loc(ai

)=Loc(a0)+i×L

第8

頁5.2數組的存儲和實現數組的存儲結構與尋址——二維數組常用的兩種映射方法:按行優先:先行后列,先存儲行號較小的元素,行號相同者先存儲列號較小的元素。按列優先:先列后行,先存儲列號較小的元素,列號相同者先存儲行號較小的元素。

二維數組內存二維結構一維結構第9

頁5.1數組的概念Pascal語言數組的行優先存儲a111a112a113

…a11n

a121a122a123

…a12n

…………

a1m1a1m2a1m3

…a1mn

a211a212a213

…a21n

a221a222a223

…a22n

…………

a2m1a2m2a2m3

…a2mn

ak11ak12ak13

…ak1n

ak21ak22ak23

…ak2n

…………

akm1akm2akm3

…akmn第10

頁5.1數組的概念FORTRAN語言數組的列優先存儲a111a211a311

…ak11a121a221a321

…ak21

…………

a1m1a2m1a3m1

…akm1

a112a212a312

…ak12

a122a222a322

…ak22

…………

a1m2a2m2a3m2

…akm2

a11na21na31n

…ak1n

a12na22na32n

…ak2n

…………

a1mna2mna3mn

…akmn第11

頁5.2數組的存儲和實現二維數組——按行優先(M×N)0N-1

0M-1aij前面的元素個數=陰影部分的面積=整行數×每行元素個數+本行中aij前面的元素個數=i×N+j本行中aij

之前的元素個數每行元素個數整行數aijLoc(aij)

=Loc(a00)+(N×i+j)×L第12

頁5.2數組的存儲和實現二維數組——按行優先的更一般情況l2h2

l1h1aij前面的元素個數=陰影部分的面積=整行數×每行元素個數+本行中aij前面的元素個數=(i

-l1)×(h2

-l2+1)+(j

-l2)aijLoc(aij)=Loc(al1l2)+((i-l1)×(h2-l2+1)+(j-l2))×L本行中aij

前面的元素個數每行元素個數整行數第13

頁5.2數組的存儲和實現三維數組

三維數組:A[m1,m2,m3]:Loc(aijk)=Loc(a000)+(i×m2×m3+j×m3+k)×L

第14

頁5.2數組的存儲和實現N維數組

N維數組A[b1,b2,…,bn]中某元素地址

Loc(j1,j2,…,jn) =Loc(0,0,…,0)+(b2×b3×...×bn×j1

+b3×...×bn×j2+...+bn×jn-1+jn)L =Loc(0,0,…,0)+∑ciji 其中:cn=L,ci-1=bi×ci,1<i≤n。ni=1數組基址Ci為常數第15

頁5.2數組的存儲和實現二維數組——靜態數組表示法 typedefElemTypeArray[m*n]; ArrayA;

Amn=a00a01…

a0n-1a10a11…

a1n-1

……am-10am-11…am-1n-1a00….a0n-1a10….a1n-1….am-10….am-1n-1第16

頁5.2數組的存儲和實現數組的動態表示法 typedefstruct{ ElemType*base;//動態空間基址

intdim;//數組維數

int*bound;//維界基址(各維大小)

int*constants;//數組映像函數常量基址 }Array;A.baseA.dimA.boundsA.constantsb1b2b3c1c2c3a000a0013A[b1][b2][b3]第17

頁初始化數組操作

StatusInitArray(Array2&A,intb1,intb2){//數組的初始化

if(b1<=0||b2<=0) returnERROR;else{A.bound1=b1;A.bound2=b2;

if(!(A.base=(ElemType*)malloc(b1*b2*sizeof(ElemType)

)

)

)exit(OVERFLOW);returnOK;}}第18

頁銷毀數組操作StatusDestroyArray(Array2&A){/*銷毀數組A*/if(A.base){free(A.base);A.base=NULL;A.bound1=0;A.bound2=0;returnOK;}elsereturnERROR;}第19

讀元素操作StatusValue(Array2A,ElemType&e,intj1,intj2){/*若各下標不超界,則將所指定的A的元素值賦值給e,并返回OK*/if((j1<0)||(j1>=A.bound1)||(j2<0)||(j2>=A.bound2))returnERROR;e=*(A.base+A.bound2*j1+j2);returnOK;}第20

頁寫元素操作StatusAssign(Array2&A,ElemTypee,intj1,intj2){/*若下標不超界,則將e的值賦給所指定的A的元素,并返回OK。*/if((j1<0)||(j1>=A.bound1)||(j2<0)||(j2>=A.bound2))returnERROR;*(A.base+A.bound2*j1+j2)=e;returnOK;}第21

頁n維數組元素存儲地址的計算

假設數組Ab1b2…bn

每個元素占用L個存儲單元,Loc(j1,j2,…,jn)為元素aj1,j2,…,jn

的存儲地址。Loc(0,0,…,0)是數組A的基址。 Loc(j1,j2,…,jn)= Loc(0,0,…,0)+(b2…bnj1

+

b3…bnj2

+…+bnjn-1

+jn)L =Loc(0,…,0)+(c1j1+c2j2+…+cn-1jn-1+cnjn)intB[4][3][5]a000a001

a00b1-1a010a011a01b1-1a020a021a02b1-1第22

頁5.3矩陣的壓縮存儲

為節省存儲空間,時常會對某些矩陣進行壓縮存儲。所謂壓縮存儲: 1)對多個值相同的元只分配一個存儲空間; 2)對零元不分配存儲空間。

5.3.1特殊矩陣的壓縮存儲

5.3.2稀疏矩陣的壓縮存儲第23

頁5.3.1特殊矩陣

特殊矩陣:值相同元素或者非零元素的分布有一定規律的矩陣。對稱矩陣/上(下)三角矩陣。a11a12…

a1na21a22…

a2n……am1am2…

amna11a12…

a1n0

a22…

a2n

……00…

amn第24

頁5.3.1特殊矩陣對稱矩陣/上(下)三角矩陣 用一維數組,按行優先存儲下三角元素。a11

a12a13a14…

a1na21a22

a23a24…

a2na31a32a33

a34

…a3n…an1an2an3an4

anna11a21a22

a31a32a33

an1an2…

ann

012345n(n+1)/2-1性質:aij=aji1≤i,j≤n第25

頁5.3.1特殊矩陣對稱矩陣/上(下)三角矩陣 矩陣元素aij

在一維數組中的存儲位置

k:a11

a12a13a14…

a1na21a22

a23a24…

a2na31a32a33

a34

…a3n…an1an2an3an4

anna11a21a22

a31a32a33

an1an2…

ann

012345n(n+1)/2-1k=i(i-1)/2+j-1當ijj(j-1)/2+i-1當ij性質:aij=aji1≤i,j≤n對于下標i,j,線性地址第26

頁5.3.1特殊矩陣對稱矩陣/上(下)三角矩陣aij

在一維數組中的序號=陰影部分的面積=

i×(i+1)/2+j+1∵一維數組下標從0開始∴aij

在一維數組中的下標k=i×(i+1)/2+j0…in-10…j…n-1

aij每行元素個數12…iaij在本行中的序號aij第0行第1行…第i-1行第27

頁5.3.2稀疏矩陣稀疏矩陣:含有較多值相同元素或較多零元素,且值相同元素或者零元素分布沒有一定規律的矩陣。討論含有較多零元素的稀疏矩陣的壓縮存儲。M

=

012900000000000-3000014000240000018000001500-7000M有42(67)個元素,有8個非零元素如何進行稀疏矩陣的壓縮存儲??第28

頁5.3.2稀疏矩陣三元組順序表M

=

012900000000000-3000014000240000018000001500-7000采用三元組存儲:(行,列,值)(

(1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7))加上矩陣的行數和列數:6,7

第29

頁5.3.2稀疏矩陣三元組順序表

#defineMAXSIZE12500typedefstruct{inti,j;//非零元的行下標和列下標

ElemTypee;//非零元值

}Triple;typedefstruct{Tripledata[MAXSIZE+1];

//用于存儲三元組表,data[0]未用

intmu,nu,tu;//行數、列數和非零元個數

}TSMatrix;第30

頁5.3.2稀疏矩陣三元組表的順序存儲M

=

012900000000000-3000014000240000018000001500-7000ije12345678M.dataM.muM.nuM.tu31-361151212521813

9432464-73614678

按行(行內按列)順序存儲非零元素。第31

頁5.3.2稀疏矩陣三元組表的順序存儲——轉置算法M

=

012900000000000-3000014000240000018000001500-7000

T

=

00-3001512000180900240000000-70000000014000000000

基本算法:交換對應行/列位置上的元素。第32

頁5.3.2稀疏矩陣一般矩陣的轉置算法

…inta[m][n],b[m][n];for(i=0;i<m;++i)

for(j=0;j<n;++j)b[j][i]=a[i][j];

…算法的時間復雜度為:O(m*n)第33

頁5.3.2稀疏矩陣ije12345678M.dataM.muM.nuM.tu31-361151212521813

9432464-7361467821124

6

-713

-33

42416

1531963

142

518ije12345678M.dataM.muM.nuM.tu678第34

頁5.3.2稀疏矩陣轉置運算算法TransposeSMatrix(TSMatrixM,TSMatrix&T)基本思想 對M.data從頭至尾掃描:

第1次掃描時,將M.data中列號為1的三元組賦值到T.data中; 第2次掃描時,將M.data中列號為2的三元組賦值到T.data中; 依此類推,直至將M.data所有三元組賦值到T.data中。第35

頁121213931-3361443245218611564-7ijvijv31-325

1813

-361151615121221

1252

1813

931

9432434

2464

-746

-7361463

14M.dataT.data第一次掃描查找第1列元素第一次掃描結束第二次掃描結束第二次掃描查找第2列元素第三次掃描查找第3列元素第四次掃描查找第4列元素第五次掃描查找第5列元素第六次掃描查找第6列元素5.3.2稀疏矩陣第七次掃描查找第7列元素三元組表的順序存儲——轉置算法第36

頁5.3.2稀疏矩陣StatusTranMatrix(TSMatrixM,TSMatrix&T){T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;

if(T.tu)//非零元素個數!=0{q=1;//q為當前三元組在T.data[]存儲位置(下標)

for(col=1;col<=M.nu;++col)

for(p=1;p<=M.tu;++p)//p為掃描M.data指示器

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].e=M.data[p].e;++q;}

}//if

returnOK;}//TranMtrix算法的時間復雜度:O(nu*tu)第37

頁5.3.2稀疏矩陣時間復雜度分析轉置算法TranMatrix的時間復雜度為O(nutu)當非零元的個數tu和矩陣元素個數munu同數量級時,轉置運算算法的時間復雜度為O(numunu)算法一般用于tu<<munu的情況第38

頁5.3.2稀疏矩陣提高算法效率num[col]:存儲M第col列非零元個數cpos[col]:存儲M第col列第一個非零元在T.data中的位置121213931-3361443245218611564-7ijvM.datacpos[col]的計算方法:

cpos[1]=1cpos[col]=cpos[col-1]+num[col-1]2colncolnum[col]cpot[col]1234567

22811012785319第39

頁5.3.2稀疏矩陣第3列第二個非零元在b中的位置121213931-3361443245218611564-7colnum[col]cpot[col]1234567228110135278M.dataT.data12122112第2列第一個非零元在b中的位置139第3列第一個非零元在b中的位置31931-313-33614631443243424521825186115161564-746-74第2列第二個非零元在b中的位置65第4列第二個非零元在b中的位置第1列第一個非零元在b中的位置2793第6列第一個非零元在b中的位置掃描M.data實現M到T的轉置809第40

頁5.3.2稀疏矩陣StatusFastTransMatrix(TSMatrixM,TSMatrix&T){//采用三元組順序表存儲稀疏矩陣,求M的轉置矩陣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;//求M中每一列非零元個數

for(t=1;t<=M.tu;++t)++num[M.data[t].j];

//求第col列中第一個非零元在T.data中的序號

cpot[1]=1;

for(col=2;col<=M.nu;++col)cpot[col]=cpot[col-1]+num[col-1];第41

頁5.3.2稀疏矩陣

for(p=1;p<M.tu;++p){col=M.data[p].j;q=cpot[col];T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e;++cpot[col];

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論