1 / 29

ADT Array { 数据对象: D = {a j1,j2, ...,,ji, jn | j i =0,...,bi -1, i=1,2,..,n }n 是数组

数组. ADT Array { 数据对象: D = {a j1,j2, ...,,ji, jn | j i =0,...,bi -1, i=1,2,..,n }n 是数组 的维数, bi 是数组第 i 维的长度 数据关系: R = {R1, R2, ..., Rn} Ri = {<a j1,... ji,... jn , a j1, ...ji +1, ...jn > | 0  j k  b k -1,

lilike
Download Presentation

ADT Array { 数据对象: D = {a j1,j2, ...,,ji, jn | j i =0,...,bi -1, i=1,2,..,n }n 是数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数组 ADT Array { 数据对象: D={aj1,j2, ...,,ji, jn| ji =0,...,bi -1, i=1,2,..,n }n是数组 的维数,bi是数组第i维的长度 数据关系: R={R1, R2, ..., Rn} Ri={<aj1,... ji,... jn , aj1, ...ji +1, ...jn > | 0  jk bk -1, 1  k  n 且k  i, 0  ji bi -2, i=2,...,n } 基本操作 } ADT Array

  2. 基本操作: InitArray(&A, n, bound1, ..., boundn) 若维数n和各维长度合法,则构造相应的数组A,返回OK DestroyArray(&A) 销毁数组A Value(A, &e, index1, ..., indexn) 若各下标不超界,e赋值为所指定A的元素值,返回OK Assign(&A, e, index1, ..., indexn) 若各下标不超界,将e的值赋值给所指定A的元素,返回OK

  3. 对二维数组,有: 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {<ai,j,ai+1,j>| 0≤i≤b1-2, 0≤j≤b2-1} COL = {<ai,j,ai,j+1>| 0≤i≤b1-1, 0≤ j≤b2-2}

  4. ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) 数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表 • 1 数组的定义和特点 • 定义 • 数组特点 • 数组结构固定 • 数据元素同构 • 数组运算 • 给定一组下标,存取相应的数据元素 • 给定一组下标,修改数据元素的值

  5. a00 0 1 a01 a00 ……. 按列序为主序存放 按行序为主序存放 a10 a0,n-1 n-1 ……. a10 n am-1,0 a11 a01 …….. a00 a01……..a0,n-1 a00 a01 …….. a0,n-1 a11 a1,n-1 a10 a11 ……..a1,n-1 …….. a10 a11 …….. a1,n-1 ………. am-1,1 …………………. am-1,0 …………………. ………. am-1,1 am-1,0am-1,1…….. am-1,n-1 am-1,0 am-1,1 …….. am-1,n-1 a0,n-1 …….. a1,n-1 m*n-1 am-1,n-1 Loc(i,j)=Loc(0,0)+(b1×j+i)×L Loc( i,j)=Loc(0,0)+(b2×i+j)×L …….. am-1,n-1 • 5.2 数组的顺序存储结构 • 次序约定 • 以行序为主序 • 以列序为主序

  6. 对于n维数组

  7. a11 a12….… ….. a1n a21a22…….. ……. a2n …………………. an1an2…….. ann 按行序为主序: …... a11 a21 a22 a31 a32 an1 ann …... k=0 1 2 3 4 n(n-1)/2 n(n+1)/2-1 • 3 矩阵的压缩存储 • 对称矩阵

  8. a11 0 0…….. 0 a21 a220…….. 0 …………………. 0 an1 an2 an3…….. ann 按行序为主序: …... a11 a21 a22 a31 a32 an1 ann …... k=0 1 2 3 4 n(n-1)/2 n(n+1)/2-1 i(i-1) Loc(aij)=Loc(a11)+[( +(j-1)]*L 2 • 三角矩阵

  9. a11a12 0 …………… . 0 a21 a22a230…………… 0 0a32 a33a340……… 0 …………………………… 00… an-1,n-2 an-1,n-1an-1,n 00… …an,n-1 ann. …... a11 a12 a21 a22 a23 ann-1 ann 按行序为主序: …... k=0 1 2 3 4 3n-2-1 • 对角矩阵 Loc(aij)=Loc(a11)+[(3n-5)+(j-1)]×L

  10. 稀疏矩阵 • 定义:非零元较零元少,且分布没有一定规律的矩阵 • 压缩存储原则:只存矩阵的行列维数和每个非零元的行列下标及其值 M由{(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)唯一确定

  11. 非零元值 行列下标 i j v 0 1 2 3 4 5 6 7 8 ma #define MAXSIZE 20 typedef struct { int i,j; ElemType e; }Triple; Typedef struct{ Triple data[MAXSIZE+1]; int mu,nu,tu; }TSMatrix; • 稀疏矩阵的压缩存储方法 • 顺序存储结构 • 三元组表 678 1 2 12 1 3 9 3 1 -3 ma[0].i,ma[0].j,ma[0].v分别存放 矩阵行列维数和非零元个数 3 6 14 4 3 24 三元组表所需存储单元个数为3(tu+1) 其中tu为非零元个数 5 2 18 6 1 15 6 4 -7

  12. 求转置矩阵 • 问题描述:已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表 • 问题分析 一般矩阵转置算法: for(col=0;col<n;col++) for(row=0;row<m;row++) n[col][row]=m[row][col]; T(n)=O(mn)

  13. 678 768 i j v i j v 1 2 12 1 3 -3 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 1 6 15 1 3 9 mb 3 1 -3 2 1 12 ma 2 5 18 3 6 14 4 3 24 3 1 9 ? 5 2 18 3 4 24 6 1 15 4 6 -7 6 4 -7 6 3 14

  14. 算法分析:T(n)=O(M的列数n非零元个数t) 若 t 与mn同数量级,则 • 解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序 方法一:按M的列序转置 即按mb中三元组次序依次在ma中找到相应的三元组进行转置。 为找到M中每一列所有非零元素,需对其三元组表ma从第一行 起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb 中应有的顺序 • 算法描述: Ch4_1.c

  15. i j v i j v 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 p p p p p p p p p k k k k p p p p p p p k 678 1 2 12 1 3 9 3 1 -3 3 6 14 ma mb 4 3 24 5 2 18 6 1 15 6 4 -7 768 1 3 -3 1 6 15 2 1 12 2 5 18 3 1 9 3 4 24 4 6 -7 6 3 14 col=1 col=2

  16. cpot[1]=1; cpot[col]=cpot[col-1]+num[col-1]; (2col ma[0].j) col 3 6 7 1 2 4 5 2 num[col] 1 0 2 2 1 0 cpot[col] 方法二:快速转置 即按ma中三元组次序转置,转置结果放入b中恰当位置 此法关键是要预先确定M中每一列第一个非零元在mb中位置, 为确定这些位置,转置前应先求得M的每一列中非零元个数 实现:设两个数组 num[col]:表示矩阵M中第col列中非零元个数 cpot[col]:指示M中第col列第一个非零元在mb中位置 显然有: 5 8 9 1 3 7 8

  17. 算法描述(P100): • 算法分析:T(n)=O(M的列数n+非零元个数t) 若 t 与mn同数量级,则T(n)=O(mn) Ch4_2.c

  18. i j v i j v 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 p p p p p p p p 678 1 2 12 1 3 9 3 1 -3 col 7 3 5 6 4 1 2 3 6 14 ma mb num[col] 0 1 0 1 2 2 2 4 3 24 9 cpot[col] 8 3 1 8 5 7 5 2 18 6 1 15 6 4 -7 ++cpot[col] 2 4 6 9 3 5 7 768 1 3 -3 1 6 15 2 1 12 2 5 18 3 1 9 3 4 24 4 6 -7 6 3 14

  19. 行逻辑连接的顺序表 • 为了便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。可在稀疏矩阵的存储结构中增加一个指示“行”信息的辅助数组 类型描述: Typedef struct{ Triple data[MAXSIZE+1]; int rpos[MAXRC+1]; //各行第一个非零元的位置表 int mu,nu,tu; }TSMatrix; 例:两个稀疏矩阵相乘。

  20. 两个矩阵相乘 Q=M×N 其中M是m1×n1矩阵,N是m2×n2矩阵,当n1=m2时 for(i=1;i<=m1;++i) for(j=1;j<=n2;++j){ Q[i][j]=0; for(k=1;k<=n1;++k) Q[i][j]+=M[i][k]*N[k][j]; } 时间复杂度是O(m1*n1*n2)

  21. I j e • 1 1 3 • 1 4 5 • 2 -1 • 1 2 • M.data • I j e • 2 2 • 1 1 • 1 -2 • 3 2 4 • N.data • I j e • 2 6 • 1 -1 • 2 4 • Q.data

  22. 只需在M.data和N.data中找到相应的各对元素(即M.data中的j值和N.data中的i值相等的各对元素)相乘即可只需在M.data和N.data中找到相应的各对元素(即M.data中的j值和N.data中的i值相等的各对元素)相乘即可 对于M中的每个元素(i,k,M(i,k)),需要找到N.data中所有相应元素(k,j,N(k,j))相乘,因此需在N.data中寻找矩阵N中第k行的所有非零元。N.rpos提供相关信息

  23. row 1 2 3 4 rpos[row] 3 1 2 5

  24. if(Q是非零矩阵){//逐行求值 for(arow=1;arow<=M.mu;++arow){ ctemp[ ]=0;//累加器清0 计算Q中第arow行的积并存入ctemp[ ]中 将ctemp[ ]中非零元存储到Q.data } }

  25. typedef struct node { int col; int val; struct node *link; }JD; 5 7 1 3 ^ 3 -1 ^ 2 -2 1 -1 ^ typedef struct node *TD; ^ 4 2 ^ • 链式存储结构 • 带行指针向量的单链表表示 • 每行的非零元用一个单链表存放 • 设置一个行指针数组,指向本行第一个非零元结点;若本行无非零元,则指针为空 • 表头结点与单链表结点类型定义 需存储单元个数为3tu+mu

  26. col 2 3 1 val 4 8 5 row 2 2 4 down right 1 3 1 • 十字链表 • 设行指针数组和列指针数组,分别指向每行、列第一个非零元 • 结点定义 tpedef struct node { int row,col,val; struct node *down, *right; }JD; A.chead A.rhead ^ ^ ^ ^ ^ ^ ^

  27. 从键盘接收信息建立十字链表算法 令q=NULL,p=rh[r-1], (1)寻找插入位置:当p!=NULL且c>p->col时,p和q右移 (2)插入: a、若p==NULL且q==NULL,即本行空,则rh[r-1]==s; b、若p==NULL,q!=NULL,即走到行末,则q->right=s c、若c==p->col,则修改p->val d、若c<p->col且q==NULL,则在p之前插入s,即s是行链表中 第一个结点,令rh[r-1]=s; s->right=p; e、若c<p->col且q!=NULL,则在p之前插入s, 即 s->right=p; q->right=s; • 算法分析: T(n)=o(ts) 其中:t——非零元个数 s= max(m,n) Ch4_3.c

  28. 1 2 3 1 8 5 4 7 4 2 2 2 ^ ^ 1 3 1 ^ ^ ^ ^ ^ ^ ^ ^ m=4,n=3 1,1,3 2,2,5 2,3,4 4,1,8 2,1,7 Ch4_3.c

  29. 作业 2.6习题(P80) 一、选择题 5----10 二、填空题 5----10 三、简答题 3----5 四、算法设计题 4

More Related