数据结构:数组PPT学习教案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

T(n) O(mn2)
而一般传统矩阵的转置算法为:
for(col=0;col<=n-1;++col)
for(row=0;row<=m;++row)
t[col][row]=m[row][col];
其时间复杂度为O(n*m)。
三元组顺序表虽节省存储空间,但时间复杂度比一般矩阵转 置的算法还要复杂,同时还有可能增加算法的难度。因此, 此算法仅适用于t<=m*n的情况。
例如,存下三角阵。
第9页/共37页
在下三角矩阵中,第i行恰有i+1个元素,元素总数为: n(n+1)/2, 可将这些元素存放在sa[0..n(n+1)/2-1]中。为了便于 访问对称矩阵A中的元素,我们必须在aij和sa[k]之间找一个 对应关系。
a00
k=0 1 2 3
….
n(n+1)/2-1
第22页/共37页
方法二:快速转置的算法。按M.data中三元组次序转置, 转
置结果放入N.data中恰当位置。此法关键是要预先确定M 中每
一列第一个非零元N.data中位置,为确定这些位置,转置 前应
先求得M的每一列中非零元个数。实现:设两个数组: num[col]:表示矩阵M中第col列中非零元个数。 则cp:ot[col]:指示M中第col列第一个非零元在N.data中的位置。 cpot[1]=1; cpot[col]=cpot[col-1]+num[col-1]; (2col M.nu)
第23页/共37页
0 12 9 0 0 0 0
0 0 0 0 0 0 0
M 3 0 0 0 0 14 0
0 0 24 0 0 0 0
col
1
num[col] 2
cpot[col] 1
2 2 3
a00 c
…c
a10 a11 … c
………… …….
an-1, 0 an-1, 1 … an-1, n-1
(a)上三 角矩阵 (b) 下三角 矩阵
第11页/共37页
下三角矩阵的存储和对称矩阵类似,sa[k]的下标k和aij的 对应关系是:
i(i+1)/2+j 当i≧j n(n+1)/2 当i<j
k=
第8页/共37页
5.3.1 特殊矩阵
——非零元素或零元素的分布有一定规律的矩阵。
1、对称矩阵
在一个n阶方阵A中,若元素满足下述性质:
aij=aji 0≦i,j≦n-1
则称A为对称矩阵。
只要存储矩阵中上三角或下三角中的元素,让每两个对
称的元素共享一个存储空间,这样,能节约近一半的存储 空间。
}TSMatrix;
第17页/共37页
求转置矩 阵
问题描述:已知一个稀疏矩阵的三元组表,求该 矩阵的转置矩阵的三元组表。
例如:
0 0 3 0 0 15
0 0 M 3 0 0 15
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 7
0 0 0 0 0 0
0 0 14 0 0 0
return ok;}//TransposeSMa第tri2x0页/共37页
算法示意 :
1 2 3 4 56 7 8 1 2 3 4 56 7 8
p p p p p p p p
col=1
ij e
1 2 12 p
q
1 39 p
q
3 1 -3 p
q
3 6 14 p
q
4 3 24 p
q
5 2 18 p
在一一对应关系,在aij之前有i行,共有3*i-1个非零元素, 在第i行,有j-i+1个非零元素。故sa[k]的下标k和aij的对应 关系是:
K= 3*i-1+(j-i+1) =2*i+j
第15页/共37页
5.3.2 稀疏矩阵
0 12 9 0 0 0 0
0 0 0 0 0 0 0
M 3 0 0 0 0 14 0
第5页/共37页
数组元素 存储地 址的计 算:
1、一维 数组
LOC ( i ) = LOC ( i -1 ) + l =α+ i*l
第6页/共37页
2、二维 数组 a00 a01 … a0,n-1 a10 a11 … a1,n-1 … …… … am-1,0 am-1,1 … am-1,n-1
其 三元组表M.data从第一行起扫描一遍。由于M.data中以M行
序为主序,所以由此得到的恰是N.data中应有的顺序。 其算法实现如下:
Status TransposMatrix(TSMatrix M,TSMatrix &T){ //采用三元组表存储表示,求稀疏矩阵M的转置矩阵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].e=M.data[p].e;++q;}
下面的 带
上面的带 主对角线
第13页/共37页
例:三对角矩阵
a00 a01 a10 a11 a12 a21 a22 a23 …. ….. …. an-2 n-3 an-2 n-2 an-2 n-1 an-1 n-2 an-1 n-1
对角矩阵可按行为主序或对角线的顺序,将其压缩存 储到一个向量中,并且也能找到每个非零元素和向量下 标的对应关系。
a10 a11 a20
…… …… …… an-1,n-1
下三角阵sa[k]的下标k和aij的对应关系是: i*(i+1)/2+j 当i≧j
k=
j*(j+1)/2+i 当i<j
第10页/共37页
2、三角 矩阵 上三角或 下三角 。
a00 a01 … a 0, n-1 c a11 … a 1, n-1 ………………….. c c … a n-1, n-1
M.data
ij v
1 2 12 1 39 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7
第19页/共37页
ij v
1 3 -3
1 6 15 2 1 12 2 5 18 3 19
3 4 24 4 6 -7 6 3 14
N.data
方法一:即按N.data中三元组次序依次在M.data中找到相应 的三元组进行转置。为找到M中每一列所有非零元素,需对
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 7 0 0 067
压缩存储原则:只存矩阵的行列数和每个非零元的行列 下标及其值。 例如: M由矩阵行列数(6,7)和三元组表((1,2,12), (1,3,9), (3,1,-3),(3,6,14),(4,3,24), (5,2,18), (6,1,15), (6,4,-7) )唯一确定。
数组。这种存储表示可以对元素随机存取,各种矩阵运算
也非常简单。
矩阵中非零元素呈某种规律分布或者矩阵中出现大量
的零元素的情况下,存储空间大量浪费。
当一个矩阵中的元素有很多都是零时,零元素的个数
远大于非零元素,则称该矩阵为稀疏矩阵。
矩阵的压缩存储——为多个相同的非零元素只分配一
个存储空间;对零元素不分配空间。
又由于对数组一般不做插入和删除操作,也就是说,
数组一旦建立,结构中的元素个数和元素间的关系就不 再发生变化。因此,一般都是采用顺序存储的方法来表 示数组。
通常有两种顺序存储方式:
低下标优先
高下标优先
第4页/共37页
对二维数组而言: ⑴以行序为主序——将数组元素按行排列,第i+1 个行向量紧接在第i个行向量后面。在C语言中,数组 就是按行优先顺序存储的。 ⑵以列序为主序——将数组元素按列排列,第i+1 个列向量紧接在第i个列向量后面。 顺序存储的数组是一个随机存取结构。
0 0 0 N 0 0 0 67
12
9
0
0
0
0
0 0 0 0 0 0
0 0 0 0 14 0
0 18 24 0 00 00 00 00
0
0
7
0
0
0 76
第18页/共37页
思路:
1)将矩阵行、列数互换 2)将每个三元组中的i和j相互调换 3)重排三元组次序,使N.data中元素以N的行(M的列)为主序 三元组表M的mu,nu,值分别为:7,6,8
6 1 15 p
6 4 -7 p M.data
col=2
第21页/共37页
ij e
1 3 -3 1 6 15 2 1 12 2 5 18 3 19 3 4 24 4 6 -7 6 3 14
N.data
时间复杂度分析:T(n)=O(nutu),nu为矩阵M的列数, tu为非零元个数。
若tu与mn同数量级
Value(A,&e,index1, …,indexn)
初始条件:A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若各个下标不超界,则e赋值为所指定的A的元 素值,并返回OK
Assign (&A, e,index1, …,indexn)
初始条件:A是n维数组,e为元素变量,随后是n个下标值。
操作结果:若各个下标不超界,则将e的值赋给所指定的A 的元素值,并返回OK
} ADT Array
第2页/共37页
在C语言中,一个二维数组类型可以定义为其分量类型为 一
维数组类型的一维数组类型,也就是说,
typedef ElemType Array2[m][n];
等价于:
typedef ElemType Array1[n];
Amn=
行优先:
LOC ( i, j ) = α + ( i * n + j ) * l
3、n维数 组
LOC ( j1, j2, …,jn ) = LOC(0,0,,0)+∑ciji 其中Cn=L,Ci-1=bi*ci,1<i≤n
第7页/共37页
5.3 矩阵的压缩存储
高级语言编制程序时,常将一个矩阵描述为一个二维
第14页/共37页
如果按行为主序来存储,除第0行和第n-1行是2个元素 外,每行的非零元素都是3个,因此,需存储的元素个数
为 a030n-2a。01saa[01..03n-1a] 11 a12 a21 …… …….. a n-1 n-1
K=0 1 2 3 4 5 … … …… 3n-1 数组sa中的元素sa[k]与三对角带状矩阵中的元素aij存
数据结构:数组
会计学
1
5.1 数组的定义
数组可看成是一种特殊的线性表,其特殊在于,表中的
元素本身也是一种线性表。多维数组是向量(一维数组)的推
广。
例如,二维数组:
Amn=
a00 a01 … a0,n-1
a10 a11 … a1,n-1
… …… …
am-1,0 am-1,1 … am-1,n-1
第1页/共37页
typedef Array1 Array2[m];
数组一旦被定义,它的维数和维界就不再改变。因此, 除
了结构的初始化和销毁之外,数组的基本操作只有存取元 素和
修改元素值的操作。
第3页/共37页
5.2 数组的顺序表示和实

由于计算机的内存结构是一维的,因此用一维内存来
表示多维数组,就必须按某种次序将数组元素排成一个 序列,然后将这个线性序列存放在存储器中。
第16页/共37页
一、三元组顺序表
以顺序存储结构来表示三元组表。
#define MAXSIZE 12500
typedef struct
{ int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
数组的抽象类型定义
ADT Array{
数数aj1j据,2…对bjni是∈象数E:l组ejmi=第0S,ei…维t},的bi-长1,i度=1,,2,ji…是,数n,D组=元{a素j1j2的…j第n| ni维称下为标数,组的维 数据关系:R={R1,R2,…Rn}
R≤bi=i-{2<,aja1j…1 …ji…ji…jnjn, a, ja1j…1 …ji+ji1+…1…jnjn>∈| 0D≤,jik=≤2b, k…-1,,n1}≤k ≤n,且k≠i,0≤ji 基本操作:
上三角阵sa[k]的下标k和aij的对应关系是:
i(2n-i+1)/2+j-i 当i≦j
n(n+1)/2
当i>j
k=
第12页/共37页
3、对角 矩阵( 带状矩 阵)
对角矩阵中,所有的非零元素集中在以主对角线为中心的 带状区域中,即除了主对角线和主对角线相邻两侧的若干 条对角线上的元素之外,其余元素皆为零。
相关文档
最新文档