《数据结构与算法》第五章-数组和广义表学习指导材料
《数据结构与算法(C++语言版)》第5章 多维数组与广义表

数 组
• 4.寻址公式的计算 • 下面考虑如何根据一组给定下标求出对应数组元素地址的 问题,这是数组最重要的基本操作,一般用在高级语言的 实现当中。这里只考虑n维数组按行存储的寻址公式的计算。 用秦九韶法变换按行存储公式中的主要部分: • j1d2d3…dn + j2d3…dn +…+jn–1dn + jn • =(j1d2+ j2)d3…dn + j3d4…dn +…+jn–1dn + jn • =((j1d2+ j2)d3+ j3)d4…dn + j4d5…dn +…+jn–1dn + jn • =… • =(…(j1d2+ j2)d3+ j3)d4+j4)d5+…+jn–1)dn+ jn • =(…((0×d1+j1)d2+ j2)d3+ j3) d4+j4)d5+…+jn–1)dn+ jn
数 组
• 1. 一维数组 • 一维数组的每个元素只含一个下标,其实质上是一个线性 表,存储方法与普通线性表的顺序存储方法完全相同,即 将数组元素按它们的逻辑次序存储在一片连续区域内。设 一维数组为A =(a0, a1,…, an–1),则它的元素ai的相对地址为 Loc(ai) = i×c。这里,c表示每个元素占用的存储单元数目。
矩阵的压缩存储
• 矩阵是很多科学与工程计算问题研究的数学对象。在高级 语言程序设计中,常用二维数组来存储矩阵元素,有些程 序语言还提供了各种方便用户使用的矩阵运算。然而,对 于在数值分析中经常出现的一些阶数很高,且矩阵中有许 多值相同的元素或者是零元素的特殊矩阵,不适合用二维 数组来存放,因为这将造成大量存储空间的浪费。为了节 省存储空间,可对这类矩阵进行压缩存储,即为多个值相 同的元素只分配一个存储空间,对零元素不分配空间。
数据结构(C语言版 李素若)第五章 数组和广义表PPT资料优秀版

OLink *hl; Head(B)=e Tail(B)=() 4.求广义表的深度
h广p义), s表ub的); 定q=义p;并没有限制元L素O的递C归(,)=即广L义O表也C可(以a是11其1自)+身d的2子d表3。(i1-1)+d3(i2-1)+(i3-1)
5.3 矩阵压缩存储 18
5.3.1 对称矩阵
对称矩阵的特点是:在一个n阶方阵中,有aij=aji,其中 1≤i,j≤n。对称矩阵关于主对角线对称,比如,我们只存储下三 角中的元素aij,其特点是中j≤i且1≤i≤n,对于上三角中的元素 aij,它和对应的aji相等,因此当访问的元素在上三角时,直接 去访问和它对应的下三角元素即可,这样,原来需要n*n个存 储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个 存储单元,当n较大时,这是可观的一部分存储资源。
第5章 数组和广义表
1
5.1 数组类型定义 5.2 数组顺序存储和实现 5.3 矩阵压缩存储 5.4 稀疏矩阵 5.5 广义表
5.1 数组类型的定义 2
1.一维数组 一维数组可以看成是一个线性表或一个向量(第2章已经介 绍),它在计算机内是存放在一块连续的存储单元中,适合于 随机查找。这在第2章的线性表的顺序存储结构中已经介绍。 2.二维数组 二维数组中的每一个元素最多可有两个直接前驱和两个直接 后继(边界除外),故是一种典型的非线性结构。例如,设A 是一个有m行n列的二维数组,则A可以表示为:
LOC(bij)=LOC(b11)+(d2-c2+1)(i-1)+(j-1) 公式中第2项是i-1个整行元素,每行d2-c2+1个元素。也可以解 释为第1维下标减1乘上后面第2维下标区间。
数据结构-第五章 数组与广义表-文档资料

上 三 角 矩 阵 下 三 角 矩 阵
a00 a10 a 20 an10
0 1 2
a01 a11 a21 an11
3 4
a02 a12 a22 an12
5
6 7
a0 n1 a1n1 a2 n1 an1n1
行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
用三元组表表示的稀疏矩阵及其转置
行 列 值 (row) (col) (value) 0 3 22 0 6 15 1 1 11 1 5 17 2 3 -6 3 5 39 4 0 91 5 2 28 行 列 值 (row) (col) (value) 0 4 91 1 1 11 2 5 28 3 0 22 3 2 -6 5 1 17 5 3 39 6 0 16
4 5 6 7 8 9 10
B a00 a01 a10 a11 a12 a21 a22 a23 … an-1n-2 an-1n-1
三对角矩阵中除主对角线及在主对角线上 下最临 近的两条对角线上的元素外,所有其它元素均为 0。总共有3n-2个非零元素。 将三对角矩阵A中三条对角线上的元素按行存放在 一维数组 B 中,且a00存放于B[0]。 在三条对角线上的元素aij 满足 0 i n-1, i-1 j i+1 在一维数组 B 中 A[i][j] 在第 i 行,它前面有 3*i-1 个非零元素, 在本行中第 j 列前面有 j-i+1 个,所 以元素 A[i][j] 在 B 中位置为 k = 2*i + j。
三对角矩阵的压缩存储
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、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。
《数据结构与算法(第二版)》汪沁 第5章 数组和广义表

q[i][j]+=m[i][k]*n[k][j];
} 此算法的复杂度为 O(m1*n1*n2)。 10、答: int DiagonalProduct(int *a, int m) {
int i,j,k,sum=0; for(k=0; k<m; k++){
sum += a[k*m+k] * a[k*m+m-k-1]; } return sum; }
5、长度:5, 深度:3
6、答:(1) 9*10*6=540; (2)第 8 列 9*6=54 字节,第 5 行 10*6=60 字节
(3) 8*10 + 5 = x*9 + y x=4,y=9
A[4][9]
7、教材 P108-110
8、答:
(1)
1
2
3
4
1
1
12
2
23
3
1
44
3
3
23
4
4
14
(2)
存储结构,完成求矩阵元素之和,并分析运算的优缺点。 【参考答案】:设稀疏矩阵 A 为 m 行 n 列,如果采用二维数组常规存储,则其空间复杂度为 O(m×n)。因为要将所有的句镇元素累加起来,需要使用一个两层的嵌套循环结构,所以其 时间复杂度为 O(m×n)。如果采用三元组顺序表进行压缩存储,假设稀疏矩阵中有 t 个非零 元素,则其空间复杂度为 O(t),将所有的矩阵元素累加起来只需要将三元组顺序表扫描一遍, 其时间复杂度也为 O(t)。当 t<< m×n 时,采用三元组顺序表存储可以获得较好的时间及空 间性能。 4、广义表和线性表的区别与联系。 【参考答案】:广义表是线性表的推广,线性表是广义表的特例。当广义表中的元素都是原 子时,即为线性表。
中南大学数据结构与算法第5章数组和广义表课后作业答案

第5章数组与广义表习题练习答案5.1请按行及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。
解:按行优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分行写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这里为了便于阅读,也将其书写为分行形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语言的三维数组地址计算公式。
解:因为C语言的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表示三维数组。
Loc(A000)表示数组起始位置。
i、j、k表示当前元素的下标,d表示每个元素所占单元数。
5.3设有三对角矩阵A n*n,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)用i , j 表示k的下标变换公式。
(2)用k 表示i,j 的下标变换公式。
数据结构第5章数组和广义表2广义表ppt课件PPT精品文档33页

表中的第一个元素)和指示表尾的表尾指针域(指向除 去原表头元素后的广义表)。
4)D=( A , B ,C )
n=3,3个元素都是子表
5)E=(a, E)
n=2,a 为原子,E为子表
D=(A,B,C)=(( ),(e),(a,(b,c,d))),共享表
E=(a,E)=(a,(a,E))= (a,(a,(a,…….))),E为递归表
§5.4 广义表的类型定义
❖试用图形表示下列广义表
§5.4 广义表的类型定义 ❖广义表的特点
▪ 可共享
广义表的元素可以为其他广义表所共享 A = ( a , B ) =( a , ( b , c , d ) )
§5.4 广义表的类型定义
❖例1:求下列广义表的长度
1)A =( )
n=0,因为A是空表
2)B = ( e )
n=1,表中元素e是原子
3)C =( a ,( b , c , d ) ) n=2,a 为原子,(b, c, d)为子表
6. GetHead{ ( ( ) ) }= ( ) .
7. GetTail{ ( ( ) ) }= ( ) .
(a, b)
§5.4 广义表的类型定义 ❖注意:( )和( ( ) )的区别
前者为空表,长度=0,深度=1; 后者长度=1,深度=2,表头、表尾均为( )
§5.5 广义表的存储结构
❖广义表的存储结构
§5.4 广义表的类型定义
❖广义表的特点
▪ 有深度
广义表的深度定义为广义表中括弧的最大重数
如: H = (d, (e,( )))深度为3 注意:(1)空表的深度为1;
数据结构第五章(多维数组与广义表)串讲+复习要点

数据结构第五章多维数组和广义表第五章多维数组和广义表5.1多维数组一般用顺序存储的方式表示数组。
常用方式有:1)行优先顺序,将数组元素按行向量排列;2)列优先顺序,将数组元素按列向量排列。
计算地址的函数:LOC(Aij)=LOC(Ac1c2)+((i-c1)*(d2-c2+1)+j-c2)*d5.2矩阵的压缩存储为多个非零元素分配一个存储空间;对零元素不分配存储空间。
1.对称矩阵在一个n阶的方阵A中,元素满足Aij=Aji 0<=i,j<=n-1;称为对称矩阵。
元素的总数为:n(n+1)/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=I*(I+1)/2+J;地址计算:LOC(Aij)=LOC(sa[k])=LOC(sa[0])+k*d= LOC(sa[0])+ (I*(I+1)/2+J )*d 2.三角矩阵以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c。
元素总数为:(n(n+1)/2)+1;以行优先顺序存放的Aij与SA[k]的关系:上三角阵:k=i*(2n-i+1)/2+j-i;下三角阵:k=i*(i+1)/2+j;3.对角矩阵所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零。
|i-j|>(k-1)/2以行优先顺序存放的Aij与SA[k]的关系:k=2i+j;5.2.2稀疏矩阵当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵。
对其压缩的方法有顺序存储和链式存储。
1.三元组表将表示稀疏矩阵的非零元素的三元组(行号、列号、值)按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表。
其类型定义:#define maxsize 10000typedef int datatype;typedef struct{int i,j;datatype v;}trituplenode;typedef struct{trituplenode data[maxsize];int m,n,t;}tritupletable;2.带行表的三元组表在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
图5.2 2×3数组的逻辑状态(a) 以行为主序(b) 以列为主序图5.3 2×3数组的物理状态设有m×n二维数组A mn,下面我们看按元素的下标求其地址的计算:以“以行为主序”的分配为例:设数组的基址为LOC(a11),每个数组元素占据l个地址单元,那么a ij 的物理地址可用一线性寻址函数计算:LOC(a ij) = LOC(a11) + ( (i-1)*n + j-1 ) * l这是因为数组元素a ij的前面有i-1行,每一行的元素个数为n,在第i行中它的前面还有j-1个数组元素。
在C语言中,数组中每一维的下界定义为0,则:LOC(a ij) = LOC(a00) + ( i*n + j ) * l推广到一般的二维数组:A[c1..d1] [c2..d2],则a ij的物理地址计算函数为:LOC(a ij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )*l例5.1若矩阵A m×n 中存在某个元素a ij满足:a ij是第i行中最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。
试编写一个算法,找出A中的所有鞍点。
基本思想:在矩阵A中求出每一行的最小值元素,然后判断该元素它是否是它所在列中的最大值,是则打印出,接着处理下一行。
矩阵A用一个二维数组表示。
算法如下:void saddle (int A[ ][ ],int m, int n)/*m,n是矩阵A的行和列*/{ int i,j,min;for (i=0;i<m;i++) /*按行处理*/{ min=A[i][0]for (j=1; j<n; j++)if (A[i][j]<min ) min=A[I][j];/*找第I行最小值*/for (j=0; j<n; j++)/*检测该行中的每一个最小值是否是鞍点*/if (A[I][j]==min ){ k=j; p=0;while (p<m && A[p][j]<min)p++;if ( p>=m) printf ("%d,%d,%d\n", i ,k,min);} /* if */} /*for i*/}算法的时间性能为O(m*(n+m*n))。
5.2 特殊矩阵的压缩存储对于一个矩阵结构显然用一个二维数组来表示是非常恰当的,但在有些情况下,比如常见的一些特殊矩阵,如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵等,从节约存储空间的角度考虑,这种存储是不太合适的。
下面从这一角度来考虑这些特殊矩阵的存储方法。
5.2.1 对称矩阵对称矩阵的特点是:在一个n 阶方阵中,有a ij =a ji ,其中1≤i , j ≤n ,如图5.5所示是一个5阶对称矩阵。
对称矩阵关于主对角线对称,因此只需存储上三角或下三角部分即可,比如,我们只存储下三角中的元素a ij ,其特点是中j ≤i 且1≤i ≤n ,对于上三角中的元素a ij ,它和对应的a ji 相等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要n*n 个存储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个存储单元,当n 较大时,这是可观的一部分存储资源。
图5.5 5阶对称方阵及它的压缩存储如何只存储下三角部分呢?对下三角部分以行为主序顺序存储到一个向量中去,在下三角中共有n*(n+1)/2个元素,因此,不失一般性,设存储到向量SA[n(n+1)/2]中,存储顺序可用图5.6示意,这样,原矩阵下三角中的某一个元素a ij 则具体对应一个sa k ,下面的问题是要找到k 与i 、j 之间的关系。
对于下三角中的元素a ij ,其特点是:i ≥j 且1≤i ≤n ,存储到SA 中后,根据存储原则,它前面有i-1行,共有1+2+…+i -1=i*(i-1)/2个元素,而a ij 又是它所在的行中的第j 个,所以在上面的排列顺序中,a ij 是第i*(i-1)/2+j 个元素,因此它在SA 中的下标k 与i 、j 的关系为:k=i*(i-1)/2+j-1 (0≤k<n*(n+1)/2 )若i<j ,则a ij 是上三角中的元素,因为a ij =a ji ,这样,访问上三角中的元素a ij 时则去访问和它对应的下三角中的a ji 即可,因此将上式中的行列下标交换就是上三角中的元素在SA 中的对应关系:k=j*(j-1)/2+i-1 (0≤k<n*(n+1)/2 )综上所述,对于对称矩阵中的任意元素a ij ,若令I=max(i,j),J=min(i,j),则将上面两个式子综合起来得到: k=I*(I-1)/2+J-1。
5.3 稀疏矩阵设m*n 矩阵中有t 个非零元素且t<<m*n ,这样的矩阵称为稀疏矩阵。
很多科学管理及n(n+1)/2- 1A=图5.6 一般对称矩阵的压缩存储工程计算中,常会遇到阶数很高的大型稀疏矩阵。
如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的。
为此提出另外一种存储方法,仅仅存放非零元素。
但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所以仅存储非零元素的值是不够的,还要记下它所在的行和列。
于是采取如下方法:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v ),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。
下面讨论稀疏矩阵的压缩存储方法。
5.3.1 稀疏矩阵的三元组表存储将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,称为三元组表,采用顺序存储方法存储该表。
如图5.11稀疏矩阵对应的三元组表为图5.12。
显然,要唯一的表示一个稀疏矩阵,还需要存储三元组表的同时存储该矩阵的行、列,为了运算方便,矩阵的非零元素的个数也同时存储。
这种存储的思想实现如下:defineSMAX 1024 /*一个足够大的数*/ typedef struct{ int i,j; /*非零元素的行、列*/ datatype v; /*非零元素值*/ }SPNode; /*三元组类型*/ typedef struct{ int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/ SPNode data[SMAX]; /*三元组表*/ } SPMatrix; /*三元组表的存储类型*/这样的存储方法确实节约了存储空间,但矩阵的运算从算法上可能变的复杂些。
下面我们讨论这种存储方式下的稀疏矩阵的两种运算:转置和相乘。
1.稀疏矩阵的转置设SPMatrix A; 表示一m*n 的稀疏矩阵,其转置B 则是一个n*m 的稀疏矩阵,因此也有 SPMatrix B; 由A 求B 需要:A 的行、列转化成B 的列、行;将A.data 中每一三元组的行列交换后转化到B.data 中;看上去以上两点完成之后,似乎完成了B ,没有。
因为我们前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B 也必须按此规律实现,A 的转置B 如图5.13所示,图5.14是它对应的三元组存储,就是说,在A 的三元组存储基础上得到B 的三元组表存储(为了运算方便,矩阵的行列都从1算起,三元组表data 也从1单元用起)。
算法思路:图5.11 稀疏矩阵A=①A 的行、列转化成B 的列、行;②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。
算法如下:void TransM1 (SPMatrix *A) { SPMatrix *B;int p,q,col;B=malloc(sizeof(SPMatrix)); /*申请存储空间*/B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;/*稀疏矩阵的行、列、元素个数*/if (B->tu>0) /*有非零元素则转换*/{ q=0;for (col=1; col<=(A->nu); col++) /*按A 的列序转换*/ 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].v= A->data[p].v; q++; }/*if*/} /*if(B->tu>0)*/return B; /*返回的是转置矩阵的指针*/ } /*TransM1*/算法5.1 稀疏矩阵转置分析该算法,其时间主要耗费在col 和p 的二重循环上,所以时间复杂性为O(n*t), (设m 、n 是原矩阵的行、列,t 是稀疏矩阵的非零元素个数),显然当非零元素的个数t 和m*n 同数量级时,算法的时间复杂度为O(m*n 2),和通常存储方式下矩阵转置算法相比,可能节约了一定量的存储空间,但算法的时间性能更差一些。