最新数据结构实验五矩阵的压缩存储与运算文档格式.docx
- 文档编号:15227204
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:13
- 大小:20.46KB
最新数据结构实验五矩阵的压缩存储与运算文档格式.docx
《最新数据结构实验五矩阵的压缩存储与运算文档格式.docx》由会员分享,可在线阅读,更多相关《最新数据结构实验五矩阵的压缩存储与运算文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
;
这里:
k=i(i+1)/2+j
(i≥j)
图5-1
下三角矩阵
a00a10a11a20…an-1,0…an-1,n-1
k=
0
1
2
3
…
n(n-1)/2
n(n+1)/2-1
图5-2下三角矩阵的压缩存储
反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。
这里,i=d-1,(d是使sum=
>
k的最小整数),j=
。
2.三对角矩阵
在三对角矩阵中,所有的非零元素集中在以主对角线为中心的带内状区域中,除了主对角线上和直接在对角线上、下方对角线上的元素之外,所有其它的元素皆为零,见图5-3。
图5-3
三对角矩阵A
与下三角矩阵的存储一样,我们也可以用一个一维数组ma[0..3n-2]来存放三对角矩阵A,其对应关系见图5-4。
a00a01a10a11a12…an-1,n-2an-1,n-1
4
3n-3
3n-2
图5-4下三角矩阵的压缩存储
A中的一对下标(i,j)与ma中的下标k之间有如下的关系:
公式中采用了C语言的符号,int()表示取整,‘%’表示求余。
二、稀疏矩阵
在m×
n
的矩阵中,有t个非零元。
令δ=
称δ矩阵的稀疏因子,常认为δ≤0.05时称为稀疏矩阵。
稀疏矩阵在工程中有着大量的应用,不少工程问题都可以转化为对稀疏矩阵的计算问题。
如何进行稀疏矩阵的压缩存储呢?
为节省存储空间,应只存储非零元素。
除了存储非零元的值之外,还必须记下所在行和列的位置(i,j),即一个三元组(i,j,
)唯一确定了矩阵A的一个非零元素。
1.三元组顺序表
以顺序存储结构来表示三元组表,则可称稀疏矩阵的一种压缩存储方式。
//稀疏矩阵的三元组顺序表存储表示。
#define
MaxSize
10
//用户自定义
typedef
int
Datatype;
struct{
//定义三元组
int
i;
//非零元的行下标
j;
//非零元的列下标
Datatype
v;
//非零元的数据值
}TriTupleNode;
struct{
TriTupleNode
data[MaxSize];
//非零元的三元组表
m,n,t;
//矩阵行,列及三元组表长度
}TriTupleTable;
2.十字链表
当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表,采用纵横交叉的十字链表就比较好。
在十字链表中,每个非零元可用一个含五个域的结点表示,其中i,
j和e三个域分别表示该非零元所在的行、列和非零元的值,向右域right用以链接同一行中下一个非零元。
向下域down用以链接同一列中下一个非零元。
同一行中的非零元通过right域链接成一个线性链表,每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,故称这样的存储结构为十字链表,如图5-5所示。
图5-5
稀疏矩阵M的十字链表
//用户自定义
struct
OLNode{
i,j;
//该非零元的行和列下标
Datatype
Struct
OLNode
*right,*down
//该非零元所在行表和列表的后继链域
}OLNode;
*OLink;
{
OLink
*rhead,*chead
mu,nu,tu;
}CrossList;
第二节用三元组表实现稀疏矩阵的基本操作
【问题描述】用三元组表实现稀疏矩阵的按列转置。
【数据描述】
struct
{//定义三元组
//
非零元素的行下标和列下标
struct{//定义三元组表
【算法描述】
按照列序来进行转置。
为了找到每一列中所有的非零元素,需要对其三元组表从第一行起整个扫描一遍。
Status
TransposeSMatrix(TriTupleTable
a,
TriTupleTable
&
b){
b.m=a.n;
b.n=a.m;
b.t=a.t;
if(b.t){
q=0;
for(col=1;
col<
=a.n;
++col)
for(p=0;
p<
=a..t;
++p)
if(a.data[p].j==col){
b.data[q].i=a.data[p].j;
b.data[q].j=a.data[p].i;
b.data[q].v=a.data[p].v;
++q;
}
return
OK;
【C源程序】
#include
<
stdio.h>
string.h>
Ok
1
Maxsize
//用户自定义三元组最大长度
/*定义三元组表*/
i,j;
data[Maxsize];
m;
n;
t;
/*矩阵行,列及三元组表长度*/
void
InitTriTupleNode
(TriTupleTable
*a){
/*输入三元组表*/
i,j,k,val,maxrow,maxcol;
char
contiue;
maxrow=0;
maxcol=0;
i=j=0;
k=0;
while(i!
=-1&
j!
=-1){
/*rol=-1&
col=-1结束输入*/
printf("
input
row
\n"
);
scanf("
%d"
&
i);
col
j);
value\n"
val);
a->
data[k].i=i;
data[k].j=j;
data[k].v=val;
if
(maxrow<
i)
maxrow=i;
(maxcol<
j)
maxcol=j;
k++;
m=maxrow;
n=maxcol;
t=k-1;
showMatrix(TriTupleTable
/*输出稀疏矩阵*/
p,q;
t=0;
for(p=1;
=a->
p++)
{for(q=1;
q<
q++)
(a->
data[t].i==p&
data[t].j==q)
{printf("
%d
"
a->
data[t].v);
t++;
else
*a,TriTupleTable
*b)
{int
q,col,p;
b->
m=a->
n=a->
t=a->
if(b->
t)
{q=0;
if(a->
data[p].j==col)
data[q].i=a->
data[p].j;
data[q].j=a->
data[p].i;
data[q].v=a->
data[p].v;
main(
void)
{TriTupleTable
*a,*b;
InitTriTupleNode(a);
showMatrix(a);
/*转置前*/
TransposeSMatrix(a,b);
showMatrix(b);
/*转置后*/
【测试数据】
输入:
输出:
7
8
8
【说明】
分析算法,主要的工作是在p和col的两重循环中完成,算法的时间复杂度为O(n*t)。
如果非零元素个数t和m*n同数量级时,算法的时间复杂度变为O(m*n2)。
【实验题】
1.稀疏矩阵按行序进行转置。
2.两个稀疏矩阵的相加运算。
第三节
十字链表表示稀疏矩阵的基本操作
【问题描述】两个相同行数和列数的稀疏矩阵用十字链表实现加法运算
ele
{/*
十字链表结点类型*/
row,
col;
double
val;
*rig
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 数据结构 实验 矩阵 压缩 存储 运算
