数据结构课件第五章 数组和广义表
合集下载
Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件
M
1 1 2 3 3 4
1 5 3 1 2 4
3 7 -1 -1 -2 2
N
1 1 2 3 4 5
1 3 3 2 4 1
3 -1 -2 -1 2 7
行列下 标调换
1 5 3 1 2 4
1 1 2 3 3 4
3 7 -1 -1 -2 2
按行下 标排序
法1:
按照矩阵M的列序进行转置,即按三元组A的 第二个字段值(列下标)由小到大的顺序进行转置。 为了找到M中每一列中所有的非零元素,需要对其 三元组表a.data从第一行起整个扫描一遍,由于 a.data是以M的行序为主序来存放每个非零元素 的,对于M中具有相同列下标的非零元来讲,先扫 描到的非零元的行下标一定小于后扫描到的非零元 的行下标,由此得到的恰是b.data应有的顺序。
• 压缩的含义
– 为多个值相同的元素只分配一个存贮空间; – 零元素不分配或少分配存贮空间。
• 特殊矩阵:元素值相同或零元素分布有 一定规律的矩阵。 • 稀疏矩阵:元素值相同或零元素分布没 有规律的矩阵。 • 特殊矩阵的压缩存贮实际是将二维数组 的数据元素压缩到一维数组上。
特殊矩阵的压缩存储
特殊矩阵: 非零元在矩阵中的分布有一定规则
常用的稀疏矩阵的存储方法
三元组表示法 顺序存储 行逻辑联接的顺序表 带辅助行向量的二元组表示法 伪地址表示法 带行指针向量的单链表示法 链接存储 散列存储 行列表示法(十字链表) 多链表示法(正交表)
顺序存储
1、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。
数据结构课件-DS05-数组与广义表.ppt
若i > j,数组元素A[i][j]在矩阵的下三角部分,在 数组 B 中没有存放。因此,找它的对称元素A[j][i]。
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
的 i, 此即为该元素的行号。 j = k - i * (i + 1) / 2
此即为该元素的列号。 例,当 k = 8, 3*4 / 2 = 6 k < 4*5 / 2 =10,
取 i = 3。则 j = 8 - 3*4 / 2 = 2。
第 章 数组和广义表
a00 a01 a02 a03 上
n=4
第 章 数组和广义表
第五章 数组
数组的类型定义和表示方法 特殊矩阵和稀疏矩阵存储方法
及运算的实现 广义表的结构特点
第 章 数组和广义表
数组可以看成是一种特殊的线性表,即线性表 中数据元素本身也是一个线性表
5.1.1 二维数组的定义
定义
)
)
)
(a11 a12 ... ... a1n)
)
)
Amn
(a21
n1
n
aj1ij kj1mk in*l
第 章 数组和广义表
5.2.1 特殊矩阵
为节约存储,只存对角线及对角线以上的元素, 或者只存对角线及对角线以下的元素。前者称为 上三角矩阵,后者称为下三角矩阵。
a00 a01 a02 a0n1
aaan121000
a11
a21 an11
a12
a22 an12
数据元素同构
数组运算
给定一组下标,存取相应的数据元素
给定一组下标,修改数据元素的值
第 章 数组和广义表
矩阵Am×n看成n个列向量的线性表
第 章 数组和广义表
矩阵Am×n看成m个行向量的线性表
第 章 数组和广义表
数据结构之数组与广义表课件PPT课件
对称矩阵有n*n个元素,但只存储n*(n+1)/2 个元素即可. 若以行序为主序,把下三角中的 元素,存储在一个一维数组SA[n*(n+1)/2] 中, 则 A[i,j] 和SA[k] 的对应关系如下:
若 i>=j , 则A[i, j]在下三角中,A[i, j]之前共有 1+2+……+i+j = i*(i+1)/2+j 个元素,因此有
2
3 -1
3
1
-1
6
4
5
2
8
6
1
5
7
6
9
7 7 7
t: 1 3 -1
165 212 258 3 1 -1 634 679
➢ 基本思想:
把S转置成T,就是把S中的每一个三元组的 行号和列号(row 和col)交换,并存储在T 中。但是,这样的结果是按列优先存储的稀 疏矩阵T,所以,还必须重新排列三元组的 顺序。
3.稀疏矩阵的压缩存储
➢ 若一个m*n矩阵,有s个非0元素, 记 e=s/(m*n) e 称为稀疏因子。 当 e0.05时,则称为稀疏矩阵。
例: M=
0 2 -1 0 0 0 0 0000000 -1 0 0 0 0 4 0 0000000 0800000 5000000 0000090
➢ 在稀疏矩阵中,非0元素的排列无规律,所以不 能采用以前的压缩方法。
1. 一维数组的寻址公式
对于一维数组,若其第一个元素的首地
址为Loc(a0),下标为 i 的数组元素A[i]的地
址为Loc(ai),
a a 则 Loc( i) = Loc( 0) + k * i
( 0≤i≤n-1)
计算机基础综合PPT课件之数据结构-数组与广义表
数组的定义(3)
基本操作: InitArray(&A, n, bound1,…boundn) //构造数 组A,维数n,各维长度bound1,…boundn DestroyArray(&A) //销毁数组A Value(A, &e, index1,…indexn) //将指定的A元素赋给e Assign(&A, e, index1,…indexn) //将e的值赋给所指定的A的元素
} //for arow } //if return OK; }
链式存储结构
• 带行指针向量的单链表表示法 – 每行的非0元素链成一个单链表 – 每行的头指针组成一个表头指针数组
链式存储结构(2)
• 十字链表表示法
– 在链表中每个非0元素用一个含5个域的结点表示. – 每行的头指针组成一个一维数组 – 每列的头指针组成一个一维数组
零元素的位置
else cb=B.tu+1;
// brow为B的最后一行
for (q=B.rpos[brow];q<cb;++q) {
ccol=B.data[q].j;
//乘积元素在Q中列号
ctemp[ccol]= ctemp[ccol]+A.data[p].e*B.data[q].e;
} //for q
a00
a01 ... a0, n 1
Am n
a10
...
a11
...
a1, n 1
... ... ...
am 1,0
am 1,1
...
am
1,
n
1
数组的定义(2)
• 数组定义方式2(抽象数据类型数组)
第五部分数组和广义表教学课件
的 压
常数。下三角矩阵正好相反,它的主对角线上方均为常数, 如图所示。在大多数情况下,三角矩阵常数为零。
缩
存
a00 0 0 …….. 0
储
a10 a11 0 …….. 0
…………………. 0 an-10 an-11 an-12…….. an-1n-1
三角矩阵中的重复元素c可共享一个存储空间,其
矩
余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩
ji =0,...,bi -1, i=1,2,..,n
}
数据关系:
R1={ 0
a a <
j1 … ji…,jn jk bk -1,
1j1
…
kji+1…njn
>| 且k i,
0 ji bi -2, i=2,...,n, 0 ji bi -2,}
二维数组的定义:
数 数据对象:
实
现
以行序为主序(低下标优先)
以列序为主序(高下标优先)
0
a00
按行序为主序存放
1
a01
数
…….
组 的
n-1 a0n-1
顺
n
a10
序 表 示
a00 a01 …….. a0n-1 a10 a11 …….. a0n-1
a11 ……..
和
a1n-1
实
………………….
……….
现
am-10am-11 …….. am-1n-1
定
10
11
1 n-2
义
A
=
m* n
...
... ...
...
a
a
数据结构课件PPT数组和广义表
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if (T.tu)
{ q=1; for (col=1;col<=T.mu;++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; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &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 (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; 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]; } }
{ q=1; for (col=1;col<=T.mu;++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; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &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 (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; 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]; } }
大学数据结构课件--第5章 数组和广义表
a 32 a 33 a 34 0 0
a 43 a 44 a 45 0
a 54 a 55 a 56 a 65 a 66
5.3.2 稀疏矩阵
稀疏矩阵的存储:如何表示非零元素的位置信息 1. 三元组表:每个元素用一个三元组(i,j,v)来表示。 i j v
0 1 6 1 1 6 2 3 8 12 9
2
3 4 5 6 7 8
2
5.2 数组的顺序表示和实现
a00 a00 a10 a01 存储单元是一维结构,而数组是个多维结构 , …… …… 则用一组连续存储单元存放数组的数据元素就有 am-1,0 a0,n-1 个次序约定问题。 a01 a10
a11
……
a11
……
二维数组可有两种存储方式: am-1,1 a1,n-1
……
K=
i*n-i(i-1)/2+j-i n(n+1)/2
当 i≤j 当i>j
0 a11 ... a1n-1 ... ... ... ... 0 0 0 an-1n-1
当i ≤ j时,a[i][j]是非零元素, a[i][j]前面有i行,共有n+(n-1)+(n-2)+…(n-(i-1))
=i(n+[n-(i-1)])/2=i*n-i(i-1)/2个元素,a[i][j]前面有j列,共j-i个非零元素,
A m× n
( a10 a11 … a1,n-1 )
=
注:
( … … …… ) ( am-1,0 am-1,2 … am-1,n-1 ) ( ( ( (
① 数组中的元素都具有统一的类型; ② 数组元素的下标一般都具有固定的上界和下界,即数组一旦 被定义,它的维数和维界就不再发生改变; ③ 数组的基本操作简单:初始化、销毁、存取元素和修改元素值
数据结构(C)严蔚敏(数组与广义表)PPT课件
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
Data Structure
03.12.2020
Page 5
按行序为主序存放
0
1
n-1
Am×n
=
a00 a10 ...
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
am-1,2
... a0,n-1
...
a1,n-1
... ...
... am-1,n-1
列向量
a00
Am×n
=
a10 ...
am-1,0
a01 a11 ...
am-1,1
a02 a12 ...
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
Assign(&A, e, index1, ..., indexn)
初始条件:A 是 n 维数组,e 为元素变量,随后是 n 个下标值。 操作结果:若下标不超界,则将 e 的值赋给A中指定下标的元素。
a00 a10 ……. am-1,1 a01 a11 …….. am-1,1 ………. a0,n-1 a1,n-1 …….. am-1 ,n-1
Page 7
按行序为主序存放
0
Am×n
《数据结构》第5章数组和广义表.ppt
28
28
5.3.2(续)三元组顺序表上的转置(二)
2019/12/8
9
9
5.3 矩阵的压缩存储
压缩存储:为多个值相同的非零元素只分 配一个存储空间;对零元素不分配空间。
2019/12/8
10
10
5.3.1特殊矩阵的压缩存储
特殊矩阵:非零元素按照一定的规律分布。
常见的特殊矩阵有对称矩阵、三角矩阵、对角矩 阵等。 对称矩阵:元素的值按照主对角线对称
列优先顺序——先排最左下标,从右向左, 最后排最左下标。
例如:三维数组Am*n*p以行优先方式顺序 存储,则 LOC(aijk)=LOC(a111)+[(i-1)*m*n+ (j-1)*n+(k-1)]*d
2019/12/8
8
8
数组存储的特点
只要知道开始结点的存放地址(即基地址)、维 数和每维的上、下界,以及每个数组元素所占用 的单元数,就可以将数组元素的存放地址表示为 其下标的线性函数。因此,数组中的任一元素可 以在相同的时间内存取,即顺序存储的数组是一 个随机存取结构。
二维数组A可以看成是由m个行向量组成的向量, 也可以看成是n个列向量组成的向量。
数组一旦被定义,它的维数和维界就不再改变。 因此,除了结构的初始化和销毁之外,数组只 有存取元素和修改元素值的操作。
2019/12/8
4
4
5.2 数组的顺序表示
由于计算机的内存结构是一维的,因此用一维 内存来表示多维数组,就必须按某种次序将数 组元素排成一列序列,然后将这个线性序列存 放在存储器中。
数组一旦建立,结构中的元素个数和元素间的 关系就不再发生变化。因此,一般采用顺序存 储的方法来表示数组。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3.2 稀疏矩阵
i(行) j(列) v(非0值) i(行) j(列) v(非0值)
0 1 2 3 4 5 6 7 8
6 1 1 3 3 4 5 6 6
7 2 3 1 6 3 2 1 4
8 12 9 -3 14 24 18 15 -7
0 1 2 3 4 5 6 7 8
7 1 1 2 2 3 3 4 6
5.3.2 稀疏矩阵
如何由M.data[ ]得到N.data[ ]呢?
可以将M.data [ ]中所有三元组的i和j的值互换, 则得到的N.data [ ]是一个按列优先顺序排列的 三元组表,然后再将它按行序排序,即得到转 置矩阵N的三元组顺序表。
但对数组的元素进行排序的时间复杂度将会达 到平方级。
5.2.1 特殊矩阵
在一个nn的三对角矩阵中,一共有n+n1+n-1=3n-2个非零元素,故只需3n-2个存储单元 即可,零元已不占用存储单元。即将其按行优 先的顺序压缩存储在数组sa[3n-2]中,其存储示意 图如下:
k=0 a11 1 a12 2 a21 3 a22 …… …… 3n-5 a n-1,n 3n-4 a n,n-1 3n-3
a a A= a10
00 10
a a
01
11
… … … a
a a
0,n-1
…
1,n-1
… a
… a
…
m-1,n-1
am-1,0 a01 a11
… …
m-1,0 m-1,1 …
am-1,1
5.2 数组的顺序表示和实现
由于二维数组的每个元素在内存中是顺序存储 的,因此,只要知道第一个元素的存储地址, 就可以求得其它元素的地址,如何求? 以行优先存储为例,假设设a00的内存地址为 LOC(a00),每个元素占用t个字节,则元素aij的 存储地址应为第一个元素的地址加上排在aij前 面的元素所占用的字节数,而aij的前面有i行 (0~i-1)共i×n个元素,而本行前面又有j个元素, 故aij的前面一共有i×n+j个元素。则aij的内存 地址按等差数列计算为:
typedef struct{ //定义稀疏矩阵 Triple data[maxsize]; //三元组表 int m, n, t; //稀疏矩阵行、列数、非零元个数 }TSMatrix; TSMatrix M,N;
5.3.2 稀疏矩阵
在结构体数组M.data[]中,表示非0元的三元组 是以行序为主序排列的。其中,M.data[0]未用, 可把行列值及非0元个数存入其中。
LOC(aij)=LOC(a00)+(i×n+j)×t
5.3 矩阵的压缩存储
矩阵是它是很多科学与工程计算问题中研究的 数学对象。高级语言中一般都用二维数组存储 矩阵,但有时候,对于一些阶数很高的矩阵, 如果在矩阵中有许多值相同的元素或者是零元 素,则会浪费存储空间。为了节省存储空间, 可以对这类矩阵进行压缩存储。 所谓压缩存储是指:为多个值相同的元素只分 配一个存储空间,值为零的元素不分配空间。 特殊矩阵:值相同的元素或者零元素在矩阵中 的分布有一定规律。 稀疏矩阵:元素分布无规律,零元素较多。
0 a11 1 2 3 ……
n( n+1) 2 -3 n( n+1) -2 2
n( n+1) -1 2
a21 a22 a31
……
a
n,n-2
a n,n-1
a n,n
则矩阵元aij 存储在sa[ ]数组中下标为多少(设 为k)的位置上呢?
5.3.1 特殊矩阵
有如下关系:
k=
{ j(j-1)/2+i-1 当 i<j
5.3.2稀疏矩阵
由此,一个稀疏矩阵可由表示非零元的三元组 序列和矩阵的行数、列数唯一确定。如下例:
A:稀疏矩阵M6×7
B:稀疏矩阵T7×6
5.3.2 稀疏矩阵
三元组线性表((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,8)(行数、列数、非零元个数)项,便 可作为矩阵M的存储描述了。同样,矩阵T也可 作类似表示。 三元组线性表可以采用顺序存储方式,也可以 采用链式存储结构,对应的也就是稀疏矩阵常 用两种压缩存储方式:三元组顺序表和十字链 表.重点介绍三元组顺序表。
5.2 数组的顺序表示和实现
例如二维数组A[m][n] 按行优先方式存储: a00,a01 ,…, a0,n-1,a10,a11,...,a 1,n-1 ,…, am-1,0 , am-1,1,…,am-1,n-1 a
a a A=
00 10
a
a
01
11
… … … a
a
a
a01
00
0,n-1
…
1,n-1
第五章 数组和广义表
5.1 5.2 5.3 5.4 5.5
数组的定义 数组的顺序表示和实现 矩阵的压缩存储 广义表的定义 广义表的存储结构
5.1 数组的定义
数组是大家都已经很熟悉的一种数据类型,几 乎所有高级语言程序设计中都设定了数组类型。 本章,我们仅简单地讨论数组的逻辑结构及在 计算机内的存储方式。 1 . 一维数组 一维数组可以看成是一个线性表,它在计算机 内是存放在一块连续的存储单元中,适合于随 机查找。
5.2.1 特殊矩阵
例如,下图为77的三对角矩阵(即有三条对角
线上元素非0)。
a 11 a 21 0 0 0 0 0 a 12 a 22 a 32 0 0 0 0 0 a 23 a 33 a 43 0 0 0 0 0 a 34 a 44 a 54 0 0 0 0 0 a 45 a 55 a 65 0 0 0 0 0 a 56 a 66 a 76 0 0 0 0 0 a 67 a 77
i(i-1)/2+j-1 当 i>=j ( 1≤ i,j≤n)
那么,aij和sa[k]之间的对应关系就可以由上 面的表达式确定。 由此,我们称sa[n(n+1)/2] 为n阶对称矩阵A 的压缩存储。
5.2.1 特殊矩角矩阵 即矩阵上三角部分元素是随机的,而下三角部 分元素全部相同(为某常数C)或全为0,具体 形式如下:
5.3.1 特殊矩阵
1.对称矩阵 若一个n阶方阵A中元素满足下列条件: aij=aji 其中1≤i,j≤n,则称A为对称矩阵。 如:
对称矩阵只需存储它的下三角元素或上三角元 素。一共只用存储n(n+1)/2 个元素即可。
5.3.1 特殊矩阵
假设以一维数组sa[0…n(n+1)/2](图示)作 为n阶对称矩阵A的存储结构,将矩阵的下 三角元素按行序存储到sa[]数组中.
5.3.2 稀疏矩阵
一、三元组顺序表 此时,数据类型可描述如下: #define maxsize 12500//定义非零元的最大数目 typedef struct //定义一个三元组 { int i, j; //非零元行号、列号 int v; //非零元的值 }Triple;
5.1 数组的定义
2.二维数组 如下图中,A是一个m行n列的二维数组. 二维数组也可以看成是一个定长的线性表.
a a A=
00 10
a
a
01
11
… … … a
a
a
0,n-1
1,n-1
… a
… a
…
m-1,n-1
m-1,0 m-1,1 …
5.1 数组的定义
则A可以表示为这样一个线性表: A=(a0,a1,…,an-1) 其中每个数据元素aj可以是一个列向量形式的 线性表: aj= ( a0j, a1j, …, am-1,j)
… a
… a
…
m-1,n-1
a0,n-1 a10 a11
… …
m-1,0 m-1,1 …
a1,n-1
5.2 数组的顺序表示和实现
二维数组A[m][n] 按列优先方式存储: a00,a10 ,…, am-1,0 , a01 , a11,..., am-1,1 ,…, a00 a0,n-1, a1,n-1 ,…, am-1,n-1
下面将介绍另外两种处理方法
5.3.2 稀疏矩阵
(1)按照M的列序进行转置 由于M的列即为N的行,因此,在M.data[]中, 按列值顺序进行扫描,则得到的N.data[]一定是按 行优先存放的。 方法:扫描M.data[]第1趟,找出M中所有第1列 的非0元素,交换行列值后,存入N.data[]。然后 再扫描M.data[]第2趟,找出M中第2列的所有非0元 素,交换行列值后,存入N.data[]。依次类推,M 共有多少列,则扫描多少趟。 为了能找出每一列中的所有非0元素,每趟扫 描都必须从M.data[]的第一行读到最后一行。
a11 a12 ... a1n c a 2n 22 ... a
压缩存储后其存储关系如下:
... ... ... ... k= c c c ann
{
(i-1)*(2n-i+2)/2+j-i 当 i≤j ( 1≤ i,j≤n) n(n+1)/2 当 i>j
5.2.1 特殊矩阵
(2) 下三角矩阵 即矩阵下三角部分元素是随机的,而上三 角部分元素全部相同(为某常数C)或全为0,具 体形式如下:
(0≤j≤n-1)
5.1 数组的定义
或者A可以表示为这样一个线性表: A=(a0, a1 , …, am-1) 其中,每个数据元素ai是一个行向量形式的线性表: ai=(ai0, ai1, ai2, …, ai,n-1) (0≤i≤m-1)