稀疏矩阵的压缩存储上

合集下载

数据结构实验五矩阵的压缩存储与运算学习资料

数据结构实验五矩阵的压缩存储与运算学习资料

数据结构实验五矩阵的压缩存储与运算第五章矩阵的压缩存储与运算【实验目的】1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现;2. 掌握稀疏矩阵的加法、转置、乘法等基本运算;3. 加深对线性表的顺序存储和链式结构的理解。

第一节知识准备矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。

一、特殊矩阵的压缩存储1. 对称矩阵和上、下三角阵若n阶矩阵A中的元素满足= (0≤i,j≤n-1 )则称为n阶对称矩阵。

对n阶对称矩阵,我们只需要存储下三角元素就可以了。

事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。

问题已经转化为:已知二维矩阵A[i,j],如图5-1,我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。

任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里:k=i(i+1)/2+j (i≥j)图5-1 下三角矩阵a00 a10 a11 a20 … an-1,0 … an-1,n-1k= 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。

数据结构答案(清华大学出版)

数据结构答案(清华大学出版)
10
若是N维数组,其中任一元素的地址该如何计算? 若是 维数组,其中任一元素的地址该如何计算? 维数组 低维优先的地址计算公式,该式称为n维数组的映像函数: 低维优先的地址计算公式,该式称为n维数组的映像函数: 优先的地址计算公式
n
0)+ Loc(j1,j2,…jn)=LOC(0,0, 0)+i =1 j )=LOC(0,0,…0)
a11 a12 … a1n ^
… …
am1 am2 … amn ^
^ 注:数组的运算参见下一节实例(稀疏矩阵的转置) 数组的运算参见下一节实例(稀疏矩阵的转置)
13
5.3 矩阵的压缩存储
讨论: 讨论: 1. 什么是压缩存储? 什么是压缩存储? 若多个数据元素的值都相同 则只分配一个元素值的存储空间, 值都相同, 若多个数据元素的值都相同,则只分配一个元素值的存储空间, 且零元素不占存储空间。 且零元素不占存储空间。 2. 所有二维数组(矩阵)都能压缩吗? 所有二维数组(矩阵)都能压缩吗? 未必,要看矩阵是否具备以上压缩条件。 未必,要看矩阵是否具备以上压缩条件。 3. 什么样的矩阵具备以上压缩条件? 什么样的矩阵具备以上压缩条件? 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩 一些特殊矩阵, 对称矩阵,对角矩阵,三角矩阵, 阵等。 阵等。 4. 什么叫稀疏矩阵? 什么叫稀疏矩阵 稀疏矩阵? 矩阵中非零元素的个数较少(一般小于5% 5%) 矩阵中非零元素的个数较少(一般小于5%) 重点介绍稀疏矩阵的压缩和相应的操作。 重点介绍稀疏矩阵的压缩和相应的操作。
8
无论规定行优先或列优先, 无论规定行优先或列优先,只要知道以下三要素便可随时求出 任一元素的地址(这样数组中的任一元素便可以随机存取! 任一元素的地址(这样数组中的任一元素便可以随机存取!): ①开始结点的存放地址(即基地址) 开始结点的存放地址(即基地址) 维数和每维的上、下界; ②维数和每维的上、下界; ac1,c2 … ac1,d2 ③每个数组元素所占用的单元数 Amn= … aij … ad1,c2 … ad1,d2 则行优先存储时的地址公式为: 行优先存储时的地址公式为: 存储时的地址公式为 LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L , aij之前的 数组基址 a 本行前面的

第4章专题3矩阵的压缩存储

第4章专题3矩阵的压缩存储

三元组表=( (0,0,15), (1,1,11), (2,3,6), (4,0,9) ) 如何存储三元组表?
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
稀疏矩阵的压缩存储——三元组顺序表 采用顺序存储结构存储三元组表
15 0 0 22 0 -15
0 11 3 0 0 0
A=
0 0
0 0 a43 a44 a45 0 0 0 a54 a55
(a) 三对角矩阵
按行 存储
元素aij在一维数组中的序号
=2 + 3(i-2)+( j-i + 2) =2i+ j -2 ∵一维数组下标从0开始
∴元素aij在一维数组中的下标
= 2i+ j -3
(b) 寻址的计算方法
0 1 2 3 4 5 6 7 8 9 10 11 12
0 0
0 0
6 0
0 0
0 0
91 0 0 0 0 0
三元组顺序表是否 需要预留存储空间?
稀疏矩阵的修改操作
三元组顺序表的插入/删除操作
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
稀疏矩阵的压缩存储——三元组顺序表
采用顺序存储结构存储三元组表
15 0 0 22 0 -15
0 11 3 0 0 0
上三角中的元素aij(i<j),因为aij=aji,则访问和 它对应的元素aji即可,即:k=j×(j+1)/2+i -1 。
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
特殊矩阵的压缩存储——三角矩阵

稀疏刚度矩阵存储

稀疏刚度矩阵存储

稀疏刚度矩阵存储稀疏刚度矩阵存储是一种在计算机科学和工程领域中常用的数据结构,用于有效地存储大规模稀疏矩阵的信息。

稀疏矩阵是指大部分元素为零的矩阵,而稀疏刚度矩阵则是在有限元分析等工程领域中常见的一种特殊矩阵,用于描述结构体系的刚度信息。

在实际工程计算中,由于稀疏刚度矩阵的特殊性,采用传统的存储方式会造成大量的存储空间浪费,而且会增加计算的复杂度和时间。

因此,研究者们提出了一种更加高效的稀疏矩阵存储方法,即稀疏刚度矩阵存储。

稀疏刚度矩阵存储的核心思想是只存储矩阵中非零元素的信息,通过记录非零元素的位置和数值,避免了存储大量冗余的零元素,从而节省了存储空间。

同时,稀疏矩阵存储方法还可以提高计算效率,因为在进行矩阵运算时,只需要考虑非零元素的计算,而无需关注零元素。

常见的稀疏刚度矩阵存储方法包括压缩稀疏行存储(Compressed Sparse Row, CSR)、压缩稀疏列存储(Compressed Sparse Column, CSC)和双重压缩稀疏矩阵存储(Compressed Row Storage, CRS)等。

这些存储方法在存储矩阵的非零元素时,采用不同的方式来组织和存储数据,以便更加高效地进行矩阵运算和计算。

在实际工程计算中,稀疏刚度矩阵存储方法被广泛应用于有限元分析、计算流体力学、结构优化等领域。

通过合理选择和使用稀疏矩阵存储方法,工程师和研究者们可以有效地提高计算效率,节约存储空间,从而更好地完成复杂结构体系的计算和分析工作。

总的来说,稀疏刚度矩阵存储是一种重要的数据存储方法,可以在工程计算和科学研究中发挥重要作用。

通过深入研究和应用稀疏矩阵存储方法,可以更好地解决大规模稀疏矩阵存储和计算的问题,为工程和科研工作提供更加有效的支持。

稀疏矩阵存储和操作稀疏矩阵的数据结构与算法

稀疏矩阵存储和操作稀疏矩阵的数据结构与算法

稀疏矩阵存储和操作稀疏矩阵的数据结构与算法稀疏矩阵是指具有大量零元素和少量非零元素的矩阵。

在实际场景中,由于矩阵中大部分元素为零,传统的矩阵存储方式会造成大量的存储空间的浪费以及数据操作的低效性。

因此,为了节省存储空间和提高数据操作的效率,稀疏矩阵的存储和操作需要借助于特定的数据结构和算法。

一、稀疏矩阵存储的数据结构1.1. 压缩存储方法压缩存储方法是一种常用的稀疏矩阵存储方法。

常见的压缩存储方法有三种:行压缩法(CSR)、列压缩法(CSC)和十字链表法。

1.1.1. 行压缩法(CSR)行压缩法是通过两个数组来存储稀疏矩阵的非零元素。

第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。

1.1.2. 列压缩法(CSC)列压缩法与行压缩法相似,只是存储方式不同。

列压缩法是通过两个数组来存储稀疏矩阵的非零元素。

第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。

1.1.3. 十字链表法十字链表法是一种更加灵活的稀疏矩阵存储方法。

通过使用链表的方式,将非零元素存储在链表中,并且每个非零元素还具有行和列的指针,方便进行数据操作。

1.2. 坐标存储法坐标存储法是一种简单直观的稀疏矩阵存储方法。

每个非零元素包括行列坐标和元素值,通过三元组的方式进行存储。

二、稀疏矩阵的操作算法2.1. 矩阵转置矩阵转置是指将原矩阵的行变为列,列变为行的操作。

对于稀疏矩阵,常用的转置算法为快速转置算法。

该算法通过统计每列非零元素的个数,并根据列的非零元素个数确定每个非零元素转置后的位置。

2.2. 矩阵相加矩阵相加是指将两个矩阵对应位置上的元素相加得到一个新的矩阵。

对于稀疏矩阵的相加,可以遍历两个矩阵的非零元素,对相同位置上的元素进行相加。

2.3. 矩阵相乘矩阵相乘是指将两个矩阵相乘得到一个新的矩阵。

对于稀疏矩阵的相乘,常用的算法为稀疏矩阵乘法算法。

该算法通过遍历两个矩阵的非零元素,按照矩阵乘法的规则计算得到新矩阵的非零元素。

国家开放大学《数据结构(本)》综合练习题参考答案

国家开放大学《数据结构(本)》综合练习题参考答案
10.元素 111,113,115,117 按顺序依次进栈,则该栈的不可能输出序列是( ) (进栈出栈可以交替进行)。
A. 111,113,115,117 B. 117,115,111,113 C. 117,115,113,111 D. 113,111,117,115 11.图状结构中数据元素的位置之间存在( )的关系。 A. 每一个元素都有一个且只有一个直接前驱和一个直接后继 B. 多对多 C. 一对一 D. 一对一 12.以下说法正确的是( )。 A. 栈和队列的特点都是后进后出 B. 队列的特点是先进后出 C. 栈的特点是先进先出 D. 栈的特点是先进后出 13.一个单链表中,在 p 所指结点之后插入一个 s 所指的结点时,可执行: s->next=p->next;和( )。 A. s=p->next; B. p=s->next;
国家开放大学《数据结构(本)》综合练习题参考答案
一、填空题 1.对稀疏矩阵进行压缩存储,可采用三元组表,一个有 10 行的稀疏矩阵 A 共有 97 个零元素,其相应的三元组表共有 3 个元素。该矩阵 A 有(10)列。 2.结构中的数据元素存在多对多的关系称为(图状)结构。 3.在单向链表中,q 指向 p 所指结点的直接后继结点,要删除 q 所指结点,可以 用操作(p->next;)= q->next;。 4.n 个元素进行冒泡法排序,第 j 趟冒泡要进行(n-j)次元素间的比较。 5.对稀疏矩阵进行压缩存储,矩阵中每个非零元素对应的三元组包括该元素的行 下标、列下标和(数组元素)三项信息。 6.中序遍历(二叉排序树)树可得到一个有序序列。 7.队列的操作特点是后进(后出)。 8.待排序的序列为 8,3,4,1,2,5,9,采用直接选择排序算法,当进行了两 趟选择后,结果序列为(1,2,4,8,3,5,9)。 9.n 个元素进行冒泡法排序,通常需要进行(n-1)趟冒泡。 10.广义表((a,b),d,e((i,j),k))的长度是(4) 。 11.中序遍历二叉排序树可得到一个(有序)的序列。 12.广义表的(c,a,(a,b),d,e,((i,j),k))深度是(3)。 13.广义表(c,a,(a,b),d,e,((i,j),k))的长度是(6)。 14.对稀疏矩阵进行压缩存储,可采用三元组表,一个有 10 行 10 列的稀疏矩阵 A 共有 95 个零元素,其相应的三元组表共有(5)个元素。 15.广义表的(c,a,(a,b),d,e,((i,j),k))深度是(3)。 16.在对一组记录(50,49,97,22,16,73,65,47,88)进行直接插入排序 时,当把第 7 个记录 65 插入到有序表时,为寻找插入位置需比较(3)次。 17. 循 环 队 列 在 规 定 少 用 一 个 存 储 空 间 的 情 况 下 , 队 空 的 判 定 条 件 为 (front==rear)。 18.一棵有 5 个叶结点的哈夫曼树,该树中总共有(9)个结点。 19.c 语言中,字符串“E”存储时占(2)个字节。

稀疏矩阵压缩的存储方法是

稀疏矩阵压缩的存储方法是

稀疏矩阵压缩的存储方法是稀疏矩阵压缩是一种数据结构,可以有效地占用存储空间,合理地存储稀疏矩阵。

通常来说,稀疏矩阵的元素大部分为0,只有少部分非零,所以采用压缩存储方法可以大大减少存储空间的使用。

稀疏矩阵的压缩存储方法有三种:顺序表压缩、链表压缩和十字链表压缩。

下面将对这三种方法进行详细介绍。

1.顺序表压缩方法:顺序表压缩方法是使用一个一维数组来存储稀疏矩阵。

数组的第一行存储矩阵的行数、列数、非零元素的个数。

数组的后续元素按行优先顺序存储矩阵的每一个非零元素。

例如,对于一个3*3的稀疏矩阵:1 0 00 0 23 0 0它的顺序表压缩形式为:3 3 2 第一行分别为行数、列数和非零元素个数1 1 1 第1个非零元素在第1行第1列,值为12 3 2 第2个非零元素在第2行第3列,值为23 1 3 第3个非零元素在第3行第1列,值为3在这个例子中,非零元素的个数为3,而原先需要占据9个空间的矩阵,现在只需要使用7个元素的数组就可以存储。

2.链表压缩方法:链表压缩方法首先将稀疏矩阵存储在单链表中。

单链表中的每一个节点包含4个数据域:行数,列数,元素值和指针域。

其中,指针域指向下一个非零元素节点。

例如,对于一个5*5的稀疏矩阵:0 0 0 0 03 0 0 0 00 0 1 0 00 0 0 2 00 0 0 0 0它的链表表示形式如下:(1,2,3)->(2,1,3)->(3,3,1)->(4,4,2)其中,每个元素依次表示行数、列数和元素值。

指针域则指向下一个非零元素。

相对于顺序表压缩,链表压缩更适用于稀疏矩阵比较大时,且存在大量的非零元素。

因为链表压缩能够动态分配存储空间,可以严格掌控存储空间的使用效率。

3.十字链表压缩方法:十字链表压缩是一种特殊的链表压缩方式,因为它在存储矩阵的同时,能够比较直观地表示矩阵的结构信息。

下面是一个矩阵以十字链表方式存储的示例:首先,将矩阵按行、列分别建立链表。

国开作业《数据结构(本)-形考作业》 (34)

国开作业《数据结构(本)-形考作业》 (34)

题目:一维数组A采用顺序存储结构,每个元素占用4个字节,第8个元素的存储地址为120,则该数组的首地址是()。

选项A:88选项B:92选项C:32选项D:90答案:92题目:稀疏矩阵采用压缩存储的目的主要是()。

选项A:减少不必要的存储空间的开销选项B:表达变得简单选项C:去掉矩阵中的多余元素选项D:对矩阵元素的存取变得简单答案:减少不必要的存储空间的开销题目:一个非空广义表的表头()。

选项A:不可能是原子选项B:只能是原子选项C:可以是子表或原子选项D:只能是子表答案:可以是子表或原子题目:常对数组进行的两种基本操作是()。

选项A:建立与删除选项B:查找与索引选项C:查找和修改选项D:索引与、和修改答案:查找和修改题目:在二维数组A[8][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。

选项A:80选项B:270选项C:100选项D:240答案:240题目:设有一个18阶的对称矩阵A,采用压缩存储的方式,将其下三角部分以行序为主序存储到一维数组B中(数组下标从1开始),则矩阵中元素A10,8在一维数组B中的下标是()。

选项A:58选项B:18选项C:45选项D:53答案:53题目:广义表((a))的表尾是()。

选项A:(a)选项B:0选项C:((a))选项D:a答案:0题目:设有一个10阶的对称矩阵A,采用压缩存储的方式,将其下三角部分以行序为主序存储到一维数组B中(数组下标从1开始),则矩阵中元素A8,5在一维数组B中的下标是()。

选项A:41选项B:85选项C:32选项D:33答案:33题目:设广义表类((a,b,c)),则L的长度和深度分别为()。

选项A:1和3选项B:1和1选项C:2和3选项D:1和2答案:1和2题目:广义表( a , a ,b , d , e ,( (i ,j ) ,k ) )的表头是________。

稀疏矩阵及其压缩存储方法

稀疏矩阵及其压缩存储方法

稀疏矩阵及其压缩存储方法1.基本概念稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。

设m行n列的矩阵含t个非零元素,则称以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。

特殊矩阵:值相同的元素或0元素在矩阵中的分布有一定的规律。

如下三角阵、三对角阵、稀疏矩阵。

压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间。

目的是节省大量存储空间。

n x n的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。

2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构)三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。

它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。

当矩阵中的非0元素少于1/3时即可节省存储空间。

(1)稀疏矩阵的三元组顺序表存储表示方法#define MAXSIZE 12500 // 假设非零元个数的最大值为12500typedef struct {int i, j; // 该非零元的行下标和列下标ElemType e; //非零元素的值} Triple; // 三元组类型typedef union { //共用体Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用int mu, nu, tu; // 矩阵的行数、列数和非零元个数} TSMatrix; // 稀疏矩阵类型(2)求转置矩阵的操作◆用常规的二维数组表示时的算法for (col=1; col<=nu; ++col)for (row=1; row<=mu; ++row)T[col][row] = M[row][col];其时间复杂度为: O(mu×nu)◆用三元组顺序表表示时的快速转置算法Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) {// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵TT.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];// 求M 中每一列所含非零元的个数cpot[1] = 1;for (col=2; col<=M.nu; ++col) cpot[col] = cpot[col-1] + num[col-1];// 求M 中每一列的第一个非零元在b.data 中的序号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];} // for} // ifreturn OK;} // FastTransposeSMatrix其时间复杂度为: O(mu +nu)3.行逻辑联接的顺序表——压缩存储稀疏矩阵方法之二(链接存储结构)行逻辑联接的顺序表:稀疏矩阵中为了随机存取任意一行的非0元素,需要知道每一行的第一个非0元素在三元组表中的位置,因此将上述快速转置算法中指示行信息的辅助数组cpot 固定在稀疏矩阵的存储结构中,让每一行对应一个单链表,每个单链表都有一个表头指针,这种“带行链接信息”的三元组表即称为行逻辑联接的顺序表。

稀疏矩阵的特征

稀疏矩阵的特征

稀疏矩阵的特征稀疏矩阵是指矩阵中大部分元素为零的矩阵。

相对于密集矩阵,稀疏矩阵在存储和计算上具有很大的优势。

稀疏矩阵的特征主要包括稀疏度、存储格式以及稀疏矩阵的运算。

一、稀疏度稀疏度是指矩阵中非零元素的比例。

稀疏度越高,矩阵中的非零元素越少,矩阵越稀疏。

稀疏度可以用非零元素个数与矩阵总元素个数的比值来表示。

对于一个n×n的矩阵,如果非零元素的个数为m,则稀疏度为m/(n×n)。

稀疏度的高低直接影响着存储和计算的效率。

当稀疏度很高时,矩阵中的零元素占据了很大一部分,此时可以通过合理的存储格式来减少存储空间的占用,提高存储效率。

同时,在进行矩阵运算时,可以通过跳过大量的零元素来减少计算量,提高计算效率。

二、存储格式稀疏矩阵的存储格式有多种,常见的有压缩稀疏矩阵(Compressed Sparse Matrix,简称CSR)、坐标存储法(Coordinate Storage,简称COO)和对角线存储法(Diagonal Storage,简称DIA)等。

1. 压缩稀疏矩阵(CSR)是一种广泛应用的存储格式。

它将矩阵分为三个部分:非零元素数组、行偏移数组和列索引数组。

非零元素数组存储矩阵中的非零元素,行偏移数组记录每一行的非零元素在非零元素数组中的起始位置,列索引数组记录每个非零元素所在的列号。

2. 坐标存储法(COO)是最简单的存储格式之一。

它将矩阵中的每个非零元素存储为一个三元组,包括元素的行号、列号和值。

COO 格式适用于非结构化的稀疏矩阵。

3. 对角线存储法(DIA)适用于具有大量对角线元素的稀疏矩阵。

它将矩阵中的每个对角线存储为一个数组,数组的长度为对角线元素的个数,每个元素对应一个对角线的偏移量。

不同的存储格式适用于不同的稀疏矩阵,选择合适的存储格式可以提高存储效率和计算效率。

三、稀疏矩阵的运算稀疏矩阵的运算包括加法、减法、乘法等。

在进行矩阵运算时,由于稀疏矩阵的特殊性,可以通过跳过大量的零元素来减少计算量,提高运算效率。

矩阵的压缩存储

矩阵的压缩存储

矩阵的压缩存储前⾔ ⼀⼊编程深似海,从此砖头是爱⼈,⽇⽇搬,夜夜搬,搬到天荒地⽼,精尽⼈亡,直教⼈失去了⾃我,忘记了时间,忽然之间发现九⽉份快没了,赶紧写篇博客打个卡,证明⼀下我还活着。

数组与矩阵 数组是由⼀组相同类型的数据元素构成的有限序列,访问数据元素的⽅式是使⽤元素各⾃的序号进⾏访问,也就是下标。

数组它本⾝是线性表的推⼴,⼀维数组就是⼀个向量形式的线性表,⼆维数组就是由⼀维数组组成的线性表。

在许多科学计算和⼯程应⽤中,经常要⽤到矩阵的概念,我们⽤的最多的其实就是Mysql的表,表数据都是⾏列存储,这就是矩阵。

由于矩阵具有元素数⽬固定以及元素按下标关系有序排列等特点,所以在使⽤⾼级语⾔编程时,⼀般都是⽤⼆维数组来存储矩阵。

数组的顺序存储为什么是顺序存储? 我想问这个问题就太低级了。

因为它是数组,数据的存储⽅式分为顺序存储和链式存储两种,数组⼀旦被定义,他的维数和维界就已固定,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作,不存在插⼊和删除操作,所以数组适合⽤顺序存储。

数组存放在内存中的映射关系 数组可以是多维的,但是内存空间却是⼀维的,所以我们就要把多维数组通过⼀定的映射顺序把它变成⼀维的,然后存储到内存空间之中。

在⼤多数⾼级编程语⾔中,多维数组在内存中通常有两种不同的顺序存储⽅式,按⾏优先顺序存储和按列优先顺序存储。

举个例⼦,以下3⾏4列的⼀个⼆维数组矩阵:a1,a2,a3,a4b1,b2,b3,b4c1,c2,c3,c4 按⾏优先顺序存储: 按列优先顺序存储:地址计算 地址计算的意思就是给定数组下标,求在⼀维内存空间的地址,从⽽取出数据。

我们先来看⼀维数组的地址计算 ⼀维数组内的元素只有⼀个下标,存储⽅法和普通的线性表⼀样。

如⼀维数组 A = [a1,a2,a3,......ai,.........,an],每个元素占⽤size个存储单元(就是内存⼤⼩),那么元素ai的存储地址为 A[0]的位置 + (i-1)*size再来看⼆维数组的地址计算 以⼆维数组Amn为例,⾸元素为A[0][0],数组中任意元素A[i][j]的地址为:A[0][0]的位置 + (n * (i-1) + (j-1))* size;⽐如:⼀个5⾏4列的⼆维数组A,按⾏存储,其中每个元素占2个存储单元,⾸元素地址是1000,求第3⾏第2列的元素在内存中的地址。

数据结构-稀疏矩阵的三元组表存储方法

数据结构-稀疏矩阵的三元组表存储方法

0 0 -3 0 0 15
0 12 9 0 0 0 0
12 0 0 0 18 0
00 00000
9 0 0 24 0 0
M= -3 0 0 0 0 14 0 0 0 24 0 0 0 0
求解 N=
0 0 0 0 0 -7 0000 00
0 18 0 0 0 0 0
0 0 14 0 0 0
15 0 0 0 0 0
4 3 24 5 2 18
注意:
data 7 data 8
6 1 15 6 4 -7
mu=6 nu=7 tu=8
为了保存矩阵的行数、列 数和非零元素个数,还需 增设三个量:mu nu tu
3.三元组线性表的数据类型描述
#define MAXSIZE 12500 //非零元素个数的最大值
typedef struct{
稀疏矩阵的压缩存储 ———三元组表
一、什么是稀疏矩阵(sparse matrix)
如果矩阵M中的大多数元素均 为零元素,则称矩阵M为稀疏矩 阵 。一般地,当非零元素个数 只占矩阵元素总数的25%—30%, 或低于这个百分数时,我们称这样 的矩阵为稀疏矩阵。
一、什么是稀疏矩阵(sparse matrix)
3.算法描述
status TransposeSMatrix(TSMatrix a, TSMatrix *b){ (*b).mu=a.nu; (*b).nu=a.mu; (*b).tu=a.tu; if ((*b).tu) { q= 1; for (col= 1 ; col<= a.nu ; + + col) for (p= 1 ; p<= a.tu ; + +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].e=a.data[p].e; ++q; } return OK;

稀疏矩阵的压缩存储方法

稀疏矩阵的压缩存储方法

稀疏矩阵的压缩存储⽅法稀疏矩阵:⾮零元多,在矩阵中随机出现假设 m ⾏ n 列的矩阵含 t 个⾮零元素,则称δ=t/(m*n)为稀疏因⼦。

通常认为δ<= 0.05 的矩阵为稀疏矩阵。

常规存储⽅法缺点: 1) 零值元素占了很⼤空间; 2) 计算中进⾏了很多和零值的运算,遇除法,还需判别除数是否为零。

稀疏矩阵的压缩存储⽅法:⼀、三元组顺序表⼆、⾏逻辑联接的顺序表三、⼗字链表⼀、三元组顺序表•采⽤⼀维数组以⾏为主序存放每⼀⾮零元;•每⼀⾮零元只存⾏号、列号、⾮零元的值;如何求转置矩阵?1. 根据三元组顺序表的特点,⾸先扫描⼀遍三元素,将扫描到的列号为1的⾮0元⾏列交换存放于转置后的新阵,⽣成新阵第⼀⾏的⾮0元;2. 再扫描⼀遍三元素,将扫描到的列号为2的⾮0元⾏列交换存放于转置后的新阵,⽣成新阵第⼆⾏的⾮0元;3. …… ⽅法1:将矩阵M转置成矩阵T⽅法2:减少原阵的扫描次数,提⾼时间效率Num[col]:存放矩阵T中每⼀⾏⾮零元的个数Cpot[col]:存放矩阵T中每⼀⾏⾮零元的当前存放的位置所谓“位置” ,即在三元组中存放的数组元素的下标cpot[1] = 1;for (col=2; col<=M.nu; ++col)cpot[col] = cpot[col-1] + num[col-1];1#define ElemType int2#define MAXSIZE 125003 typedef struct{4int j,i; //该⾮零元的⾏下标和列下标5 ElemType e; // 该⾮零元的值67 }Triple; // 三元组类型89 typedef struct{10 Triple data[MAXSIZE+1];11int mu,nu,tu;1213 }TSMatrix; // 稀疏矩阵类型1415//⽅法1:将矩阵M转置成矩阵T16 status TranspostSMatrix(TSMatrix M,TSmatrix $T){17 T.mu=M.nu;18 T.nu=M.mu;19 T.tu=M.tu;20if(T.tu){21 q=1;22//M.data[p]是在第⼀个元素开始存的M.data[0]空出来23for(col=1;col<=M.nu;++col)24for(p=1;p<=M.tu;++p){25if(M.data[p].j==col){26 T.data[q].i=M.data[p].j;27 T.data[q].j=M.data[p]=i;28 T.data[q].e=M.data[p].e;29 q++;30 }31 }3233 }34return0;35 }363738//⽅法2:减少原阵的扫描次数,提⾼时间效率39 status FastTransposeSMatrix(TSMtrix M,TSMatrix &T){40 T.mu=M.nu;41 T.nu=M.mu;42 T.tu=M.tu;43if(T.tu){44for(col=1;col<=M.nu;++col)45 num[col]=0;46for(t=1;t<=M.tu;++t)47 ++num[M.data[t].j];4849 cpot[1] = 1;50for (col=2; col<=M.nu; ++col)51 cpot[col] = cpot[col-1] + num[col-1];52//减少原阵的扫描次数,提⾼时间效率53for(p=1;p<=M.tu;++p){54 col=M.data[p].j;55 q=cpot[col];56 T.data[q].i=M.data[p].j;57 T.data[q].j = M.data[p].i;58 T.data[q].e = M.data[p].e;59 ++cpot[col]60 }61 }62return o;63 }⽅法⼀:时间复杂度为: O(M.nu*M.tu)⽅法⼆:时间复杂度为: O(M.nu+M.tu)。

数据结构-稀疏矩阵的三元组表存储方法

数据结构-稀疏矩阵的三元组表存储方法

M=
注意:用变量 和 分别存放矩阵 注意 用变量a和 b分别存放矩阵 用变量 M和N (TSMatrix a, TSMatrix b), 和 即要从已知变量a来求得变量 来求得变量b的 即要从已知变量 来求得变量 的 值。
也既要完成如下求解工作: 也既要完成如下求解工作:
a . data p a .data 1 a .data 2 a .data 3 a .data 4 a .data 5 a .data 6 a .data 7 a .data 8 i 1 1 3 3 4 5 6 6 j 2 3 1 6 3 2 1 4 e 12 9 -3 14 24 18 15 -7 b . data q b .data 1 b .data 2 b .data 3 i 1 1 2 2 3 3 4 6 j 3 6 1 5 1 4 6 3 e -3 15 12 18 9 24 -7 14
求得
b .data 4 b .data 5
无!
b .data 6 b .data 7 b .data 8
a. mu=6 a. nu=7 a. tu=8
注:p=1:8,寻找 j=col 的a.data[ p] 寻找
2.求解步骤分析:p=1:8, q的值 求解步骤分析: 的值=8 求解步骤分析 的值
a . data p a .data 1 a .data 2 a .data 3 a .data 4 a .data 5 a .data 6 a .data 7 a .data 8 i 1 1 3 3 4 5 6 6 j 2 3 1 6 3 2 1 4 e 12 9 Col=6 -3 14 求得 24 18 15 -7 b . data q b .data 1 b .data 2 b .data 3 b .data 4 b .data 5 b .data 6 b .data 7 b .data 8 i 1 1 2 2 3 3 4 6 j 3 6 1 5 1 4 6 e -3 15 12 18 9 24 -7

数据结构-第四章 矩阵的压缩存储.

数据结构-第四章 矩阵的压缩存储.

3
二维数组同样满足数组的定义。一个二维 数组可以被看成是特殊的一维数组,其中, 每个元素又是一个一维数组。多维数组可以 按同样的方法类推。
) )
Amn
( a11 a12 (a 21 a 22 ... ( ... (a m1 a m 2
( ) (
... ... a1n ) ... ... a 2 n ) ... ... ... ) ... ... a mn )
特殊矩阵:值相同的元素或零元素在矩阵中
分布有一定规律。 稀疏矩阵:零元素较多,分布无规律。
11
4.2.1
对称矩阵
Aij Aji
在一个n阶方阵A中,若元素满足下述性质:
则称A为对称矩阵。对称矩阵中的元素关于主 对角线对称,故只需要存储矩阵的上三角或下 三角矩阵,这样可以节约大约一半的空间。
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
col
1 2 1
2 2
3
4 1
5 0
6 1 8
7 0 9
num[col]
cpot[col]
2
5
3
7
8
扫描矩阵三元组表,根据某项的列号,确定它转置 后的行号,查 cpot表,按查到的位置直接将该项存入 转置三元组表中。
7
二维数组与高维数组
1)存储方式
计算机的存储结构是一维的,因而多维数组必须 按某种次序排成一个线性序列加以存储。
a[1][1] a[2][1] A a[3][1] a[m][1]

a[1][2] a[2][2] a[3][2]
a[1][3] a[2][3] a[3][3]

稀疏矩阵的存储与压缩

稀疏矩阵的存储与压缩

稀疏矩阵的存储与压缩稀疏矩阵是指其中大部分元素为0的矩阵。

由于矩阵中存在大量的0元素,因此在存储和处理稀疏矩阵时,采用传统的二维数组存储方式会造成大量的存储空间浪费和计算时间过长。

为了高效地存储和处理稀疏矩阵,人们提出了各种稀疏矩阵的存储与压缩方法。

一、压缩存储稀疏矩阵的压缩存储方法主要包括行压缩存储(CSR)、列压缩存储(CSC)和对角线压缩存储(DIA)等。

1. 行压缩存储(CSR)行压缩存储是将稀疏矩阵的非零元素按行存储在一维数组中,并使用两个数组存储每一行的非零元素和其所在的列索引。

举个例子,假设有一个3×3的稀疏矩阵,其非零元素分别为a(1,2)=5、a(2,1)=3、a(2,3)=7和a(3,2)=4,那么行压缩存储的结果为:values = [5, 3, 7, 4]columns = [2, 1, 3, 2]row_pointers = [0, 1, 3, 4]其中values数组存储了非零元素的值,columns数组存储了非零元素所在的列索引,row_pointers数组存储了每一行的非零元素在values 和columns数组中的起始位置。

该压缩存储方法可以有效地节省存储空间,并且便于进行行遍历。

2. 列压缩存储(CSC)列压缩存储与行压缩存储类似,只是将稀疏矩阵的非零元素按列存储在一维数组中,并使用两个数组存储每一列的非零元素和其所在的行索引。

同样以上述的稀疏矩阵为例,列压缩存储的结果为:values = [3, 5, 7, 4]rows = [2, 1, 2, 3]column_pointers = [0, 1, 3, 4]其中values数组存储了非零元素的值,rows数组存储了非零元素所在的行索引,column_pointers数组存储了每一列的非零元素在values 和rows数组中的起始位置。

列压缩存储方法在列遍历时具有较好的性能。

3. 对角线压缩存储(DIA)对角线压缩存储适用于具有某种特定结构的稀疏矩阵,例如对角线稀疏矩阵等。

稀疏矩阵压缩的存储方法

稀疏矩阵压缩的存储方法

稀疏矩阵压缩的存储方法稀疏矩阵是在大多数元素为零的矩阵中只存储非零元素的一种矩阵表示方法。

稀疏矩阵压缩的存储方法旨在减少内存和存储空间的占用,同时保持矩阵的有效性。

以下是一些常见的稀疏矩阵压缩存储方法:1.压缩行存储(Compressed Row Storage,CRS):该方法将矩阵分为三个数组:值数组、列索引数组和行偏移数组。

值数组存储非零元素的值。

列索引数组存储每个非零元素所在的列索引。

行偏移数组存储每一行的第一个非零元素在值数组中的位置。

这种方法适用于稀疏矩阵中非零元素的分布较为均匀的情况。

2.压缩列存储(Compressed Column Storage,CCS):与CRS相似,但它将列作为主要的单位进行压缩。

值数组、行索引数组和列偏移数组分别存储非零元素的值、行索引和每一列的第一个非零元素在值数组中的位置。

这种方法适用于需要按列进行操作的情况。

3.坐标列表(COO):COO方法以三个数组的形式存储稀疏矩阵的非零元素:行索引、列索引和值。

这种方法的优势在于可以方便地添加和删除元素,但对于大型稀疏矩阵可能会浪费大量内存。

4.对角线存储(Diagonal Storage):如果稀疏矩阵是对称的,并且只存储对角线上和它下面的元素,这种存储方法可能非常有效。

只需存储对角线元素和它们的下面的元素,而忽略上面的元素。

5.分层压缩(Hierarchical Storage):对于大型稀疏矩阵,可以将矩阵分成多个较小的块,并使用其他稀疏矩阵压缩方法对每个块进行单独压缩。

这种方法有助于减小每个块的大小,从而提高存储和检索效率。

选择适当的稀疏矩阵压缩方法取决于矩阵的特点、应用需求和存储资源。

不同的方法在内存占用和操作效率方面都有各自的优劣。

根据具体情况,可以选择最适合的方法以最大程度地减小存储空间。

基于压缩存储的稀疏矩阵转置算法研究

基于压缩存储的稀疏矩阵转置算法研究

储方式 的改进办法 , 出改 进 后用 C语 言编 写 的几 给 种不 同的稀疏矩 阵 转 置算 法 , 过 出各个算法 的优缺 点。
序表 引。 稀疏矩阵 的存储 信 息 还应 包 括矩 阵 总行 数 、 矩
20 09年 l 月 1 1 0日收到
缺点。
关键词
稀 疏矩 阵
压 缩存 储
三 元组 表
矩 阵 转置
时 问 复杂 度
巾图法分类号
T 3 11 ; P 1 .2
文献标志码

计算机 中存储 矩 阵 的 一 般 方 法是 采 用 二 维 数 组, 其优点 是可以随机地访 问每一 个元 素 , 而 易于 从 实现矩 阵的各 种运算 ¨ 。但 对于稀 疏矩 阵( m Xn J 设
第l O卷
第 4期
21 0 0年 2月





工 ・ 程
Vo . 0 No 4 F b 2 0 11 . e . 01
1 7 —1 1 ( 0 0 4 1 4 - 6 1 8 5 2 1 ) —0 1 4 0
Si c eho g n n ne n c neT cnl yadE  ̄ ef g e o i
@ 2 0 S iTe h. g g 01 c. c En n .
基 于压缩 存储 的 稀疏矩 阵转 置算 法研 究
王 敏
( 南 师范 学 院 计算 机 科 学 系 , 南 74 0 ) 渭 渭 10 0


介绍 了对稀疏矩阵进行压缩存储 的几种存储方式, 重点分析 了稀疏矩阵的三元组压缩存储 的不 同存储结构 , 出利 提
素分布没有 规律 , 实现压缩存 储 , 记 录每个非 零 要 则

实验5 矩阵的压缩存储实现

实验5 矩阵的压缩存储实现

实验5 矩阵的压缩存储实现1. 实验要求(1) 实现矩阵(对称阵和稀疏阵)的压缩存储结构设计;(2) 实现矩阵的操作(稀疏矩阵快速转置和乘法)算法设计;2. 主要实验方法(1) 设计算法思想;(2) 编写算法代码;(3) 运行算法代码,并分析算法的效率;3. 实验内容实验5.1 对称矩阵顺序表存储表示(一)具体要求:(1)初始化一个对称矩阵(2)显示对称矩阵(3)任意取对称矩阵第i行第j列的值(二)测试: 输入如下对称矩阵,测试存储和访问情况对称矩阵为:1 1 0 51 2 0 70 0 1 55 7 5 7实验5.2 稀疏矩阵的三元组顺序表存储表示,及稀疏矩阵快速转置(一)具体要求:(1)初始化一个稀疏矩阵(2)显示初始化后的稀疏矩阵(3)转置(4)显示转置后的稀疏矩阵(二)测试: 输入如下稀疏矩阵,测试用三元组顺序表存储的稀疏矩阵的转置结果稀疏矩阵为:0 0 0 11 0 0 10 0 1 0实验5.3 稀疏矩阵的行逻辑链接顺序表存储表示,及稀疏矩阵乘法(一)具体要求:(1)初始化两个个稀疏矩阵a,b(2)获取这两个矩阵的各行第一个非零元的位置表rpos(2)显示初始化后的稀疏矩阵a,b(3)矩阵a和b相乘,结果存入矩阵c,即c=a*b(4)显示矩阵c(二)测试: 输入如下稀疏矩阵,测试用行逻辑链接顺序表存储的稀疏矩阵的乘积结果稀疏矩阵a为:3 0 0 50 -1 0 02 0 0 0稀疏矩阵b为:0 21 0-2 40 0乘积结果矩阵c为0 6-1 00 44. 实验重点和难点(1) 重点:特殊矩阵的压缩存储结构设计。

(2) 难点:稀疏矩阵的压缩存储结构的设计及操作算法设计。

5. 实验结果与分析(必须写这部分)应用文字、表格、图形等将数据表示出来6. 实验总结与体会必须写这部分7. 部分代码指导实验5.1实验5.2实验5.3。

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

第3讲 稀疏矩阵压缩存储上——教学讲义
稀疏矩阵是指矩阵中大多数元素为零的矩阵。

从直观上讲,当非零元素个数低于总元素的30 %时,这样的矩阵为稀疏矩阵。

如下图所示的矩阵M 、 N 中,非零元素个数均为8个,矩阵元素总数均为6 ×7 =42 ,显然8 /42 <30 %,所以M 、 N 都是稀疏矩阵。

1 稀疏矩阵的三元组表表示法 ( 1 ) 稀疏矩阵的三元组存储表示
对于稀疏矩阵的压缩存储,采取只存储非零元素的方法。

由于稀疏矩阵中非零元素aij 的分布没有规律 ,因此,要求在存储非零元素值的同时还必须存储该非零元素在矩阵中所处的行号和列号的位置信息,这就是稀疏矩阵的三元组表表示法。

每个非零元素在一维数组中的表示形式如下图所示。

说明:为处理方便,将稀疏矩阵中非零元素对应的三元组按“行序为主序”用一维结构体数组进行存放,将矩阵的每一行(行由小到大)的全部非零元素的三元组按列号递增存放。

由此得到矩阵M 、 N 的三元组表A 和B 。

如下图所示。

0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 0 15 0 0 -7 0 0 0
M=
6×7 0 0 -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 0
0 0 0 0 0
7×6
N= 稀疏矩阵M 和N
三元组的结构
( 2 )稀疏矩阵三元组表的类型定义 稀疏矩阵三元组表类型定义如下:
#define MAXSIZE 1000 /*设非零元素的个数最多为1000*/ typedef struct { int row, col; /*该非零元素的行下标和列下标*/ ElementType e ; /*该非零元素的值*/ }Triple; typedef struct
{ Triple data[MAXSIZE+1]; /* 非零元素的三元组表。

data[0]未用*/ int m, n, len; /*矩阵的行数、列数和非零元素的个数*/ }TSMatrix ;
在稀疏矩阵情况下,采用三元组表表示法大量节约了存储空间,以图5.10中的M 6*7矩阵为例,需要6*7=42个存储单元,但M 采用三元组表A 存放,共有8个非零元素,每个非零元按占3个单元计算,需要3*8=24个单元,显然比矩阵常规存储来讲还是大大节省存储。

( 3 )三元组表实现稀疏矩阵的转置运算
需要强调的是,矩阵常规存储是二维的,而三元组存储是一维的,由于矩阵存储结构的变化也带来了运算方法的不同,必需认真分析。

下面给出稀疏矩阵的转置运算问题,希望从中体会实现算法的处理思路和改进算法的技术。

矩阵转置指变换元素的位置,把位于( row,col)位置上的元素换到( col,row)位置上,把元素的行列互换。

如图5 .10的6 ×7矩阵M,它的转置矩阵就是7×6的矩阵N,并且N( row,col)= M( col,row),其中,1 ≤ row ≤ 7 ,1 ≤ col ≤ 6 。

①矩阵转置的经典算法
采用矩阵的正常存储方式(二维数组)实现矩阵转置。

稀疏矩阵转置经典算法
void TransMatrix (ElementType source[m][n], ElementType dest[n][m])
{/*source 和dest 分别为被转置的矩阵和转置以后的矩阵(用二维数组表示)*/ int i, j;
for(i=0;i<m;i++) for (j=0;j< n;j++)
dest[j][ i]=source[i] [j] ;
}
下标
行号 列号 元素值 1 1 2 12 2 1 3 9 3 3 1 -3 4 3 6 14 5 4 3 24 6 5 2 18 7 6 1 15 8 6
4
-7
下标 行号 列号 元素值
1 1 3 3
2 1 6 15
3 2 1 12
4 2
5 18 5 3 1 9
6 3 4 24
7 4 6 -7 8
6
3
14
(a )矩阵M 的三元组表A
(b )矩阵N 的三元组表B
稀疏矩阵M 和N 的三元组表表示
②三元组表实现稀疏矩阵的转置
假设A 和B 是稀疏矩阵source 和dest 的三元组表,实现转置的简单方法如下。

a.矩阵source 的三元组表A 的行、列互换就可 以得到B 中的元素,如下图所示。

b.如a 操作,转置后矩阵的三元组表B 中的三元组不是以“行序为主序”进行存放,为保证转置后的矩阵的三元组表B 也是以“行序为主序”进行存放,则需要对行、列互换后的三元组B 按B 的行下标(即A 的列下标)按递增有序进行重新排序,如下图所示。

由此可知,步骤a 很容易实现,但步骤b 重新排序势必会大量移动元素,从而影响算法的效率。

为了避免上述简单转置算法中行、列互换后重新排序引起的元素移动,可以采取以下两种处理方法。

方法一:“列序”递增转置法
【算法思想】采用按照“被转置矩阵”三元组表A 的“列序”(即转置后三元组表B 的行序)递增的顺序进行转置,并依次送入转置后矩阵的三元组表B 中,这样一来,转置后矩阵的三元组表B 恰好是以“行序为主序”。

【具体做法】
如下图所示,找出第1行全部元素:第一遍从头至尾扫描三元组表A,找出其中所有col =1的三元组,转置后按顺序送到三元组表B 中;
row col e 1 1 2 12 2 1 3 9 3 3 1 -3 4 3 6 14 5 4 3 24 6 5 2 18 7 6 1 15 8 6 4 -7 矩阵的转置(用三元组表示矩阵) B (row ,col ,e )————(col ,row ,e )
A
从头至尾扫描三元组表A,寻找col 值为k 的三元组进行转置
找出第2行全部元素:第二遍从头至尾扫描三元组表A,找出其中所有col =2的三元 组,转置后按顺序送到三元组表B 中;
如此类推……
找出第k 行全部元素:第k 遍扫描三元组表A,找出其中所有col =k 的三元组,转置后按顺序送到三元组表B 中。

k 的含义:每次扫描三元组表时,寻找的三元组的列值col=k 的三元组; k 的取值: 1 ≤ k ≤ A.n 。

为实现处理附设一个当前存放位置计数器j,用于指向当前转置后元素应放入三元组表B 中的位置下标。

j 初值为1 ,当处理完一个元素后,j 加1 。

【算法描述】 稀疏矩阵“列序”递增转置算法
void TransposeTSMatrix(TSMatrix A, TSMatrix * B)
{ /*把矩阵A 转置到B 所指向的矩阵中去。

矩阵用三元组表表示*/ int i , j, k ;
B->m= A.n ; B->n= A.m ; B->len= A.len ; if(B->len>0) { j=1; /*j 为辅助计数器,记录转置后的三元组在三元组表B 中的下标值*/
for(k=1; k<=A.n; k++) /*扫描三元组表A 共A.n 次,每次寻找列值为k 的三元组进行转
置*/
for(i=1; i<=A.len; i++) if(A.data[i].col==k) { B->data[j].row=A.data[i].col; B->data[j].col=A.data[i].row;
B->data[j].e=A.data[i].e;
j++;
/*计数器j 加1,指向本行下一 个转置后元素的位置下标*/
}/*内循环中if 的结束*/ }/* if(B->len>0)的结束*/ }/* end of TransposeTSMatrix */
(a) 三元组表A
(b)三元组表B
row col e 1 1 2 12 2 1 3 9 3 3 1 -3 4 3 6 14 5 4 3 24 6 5 2 18 7 6 1 15 8 6
4
-7
矩阵的转置示意
【算法分析】算法的时间耗费主要是在双重循环中,其时间复杂度为O( A.n×A.len)。

最坏情况为:当A.len=A.m×A.n时(即矩阵中全部是非零元素),时间复杂度为O( A.m×A.n2 ),若采用正常方式经典算法实现矩阵转置的算法时间复杂度为O( A.m×A.n)。

因此,三元组表示法仅适用于存储表示稀疏矩阵。

例5-2 已知A矩阵A.m=100 ,A.n=500 ,A.len=100 ,计算其采用三元组表存储空间和其上的“列序递增转置法”占用时间情况,并给出对比改进的思路分析。

此矩阵常规存储空间耗费为A.m×A. n=50000,三元组表存储耗费为A.len×3=300,节省存储。

采用矩阵转置的经典算法时间耗费为A.m×A. n=50000次;采用稀疏矩阵的“列序”递增转置算法,时间耗费为A.n×A.len=50000次,虽然存储空间减少,但时间复杂度并未降低,原因是要多次(如A.n=500次)扫描稀疏矩阵三元组。

相关文档
最新文档