作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!
目录
数组的顺序存储结构矩阵的压缩存储对称矩阵三角矩阵对角矩阵稀疏矩阵定义稀疏矩阵的顺序压缩存储三元组表伪地址表示法
稀疏矩阵转置——基于三元组表按M的列序转置快速转置
稀疏矩阵的链式压缩存储:十字链表
数组的顺序存储结构
数组的顺序存储结构可随机存取任一元素
以列序为主序: FORTRAN以行序为主序:C、C++
L
O
C
(
i
,
j
)
=
L
O
C
(
0
,
0
)
+
(
b
2
×
i
+
j
)
×
L
LOC(i,j) = LOC(0,0) + (b2×i+j)×L
LOC(i,j)=LOC(0,0)+(b2×i+j)×L推广到一般情况,可得到
n
n
n 维数组数据元素存储位置的映象关系
L
O
C
(
j
1
,
j
2
,
.
.
.
,
j
n
)
=
L
O
C
(
0
,
0
,
.
.
.
,
0
)
+
∑
i
=
1
n
c
i
j
i
LOC(j_1, j_2, ..., j_n ) = LOC(0,0,...,0) + \sum_{i=1}^n c_i j_i
LOC(j1,j2,...,jn)=LOC(0,0,...,0)+i=1∑nciji
其中
c
n
=
L
,
c
i
−
1
=
b
i
×
c
i
,
1
<
i
≤
n
。
其中 c_n = L,c_{i-1} = b_i \times c_i , 1 < i \leq n。
其中cn=L,ci−1=bi×ci,1 int i, j; //非零元的行、列下标
ElemType e; //非零元的值
} Triple;
//稀疏矩阵结构
#define MAXSIZE 100 //非零元最大个数
typedef struct
{
Triple data[MAXSIZE + 1]; //三元组表,data[0]未用
int mu, nu, tu; //矩阵行、列数、非零元个数
} TSMatrix;
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020080309332062.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQzNzExNA==,size_16,color_FFFFFF,t_70#pic_center)
非零元在表中按行序有序存储(便于进行依行顺序处理的矩阵运算)压缩存储后,元素
a
i
j
a_{ij}
aij的存储位置与其下标无关,而取决于之前的非零元个数。因此不支持随机存取,若需存取某一行中的非零元,需从头开始查找
伪地址表示法
伪地址:本元素在矩阵中(包括零元素在内)按行优先顺序的相对位置 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020080309404761.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQzNzExNA==,size_16,color_FFFFFF,t_70#pic_center)
稀疏矩阵转置——基于三元组表
一般的转置算法需要遍历数组的所有元素对调其行列值:
T
(
n
)
=
O
(
m
u
×
n
u
)
T(n)=O(mu\times nu)
T(n)=O(mu×nu)
基于三元组表的稀疏矩阵转置:
将矩阵行、列维数互换,非零元个数不变将每个三元组中的
i
i
i和
j
j
j相互调换,非零元值不变重排次序,使T.data中元素以T的行(M的列)为主序
关键是如何实现重排次序 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200803094440180.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQzNzExNA==,size_16,color_FFFFFF,t_70#pic_center)
按M的列序转置
按矩阵T中三元组表T.data的次序依次在矩阵M的三元组表M.data中找到相应三元组进行转置为找到M.data中第
i
i
i列所有非零元素,需对M.data扫描一遍由于M.data以M行序为主序,所以得到的恰是T.data中应有的顺序
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200803095001423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQzNzExNA==,size_16,color_FFFFFF,t_70#pic_center)
Status TransposeSMatrix(TSMatrix M, TSMatrix &T)
{
int col, p, k;
T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if(T.tu)
{
k=1;
for( col=1;col
int col, p, k, num[N], cpot[N];
T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
if( T.tu )
{
for( col=1; col int row, col; //非零元所在行、列
ElemType val; //非零元的值
struct OLNode *right, *down; //同行、同列的下一个非零元
}OLNode,* OLink ;
typedef struct
{ OLink rhead[M],chead[N]; //行、列指针数组
int mu, nu, tu; //行、列数及非零元个数
}CrossList;
适合于按行及按列进行操作的问题
|