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

合集下载

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

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

数据结构实验五矩阵的压缩存储与运算第五章矩阵的压缩存储与运算【实验目的】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。

矩阵压缩存储

矩阵压缩存储

矩阵压缩存储矩阵是在计算机科学和数学中常见的数据结构,用于表示具有行和列的二维数据。

在很多应用中,矩阵的大小可能非常大,占用大量的存储空间。

为了节省存储空间并提高计算效率,在某些情况下可以使用矩阵压缩存储技术。

什么是矩阵压缩存储?矩阵压缩存储是一种将稀疏矩阵(其中大部分元素为零)以更紧凑形式表示的技术。

通过只存储非零元素及其位置,可以显著减少所需的存储空间。

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

在实际应用中,很多情况下只有少数元素非零,例如图像处理、网络分析、自然语言处理等领域。

对于这些稀疏矩阵,传统的二维数组表示方法会浪费大量的存储空间。

稀疏矩阵压缩存储方法COO格式COO(Coordinate)格式是最简单直观的稀疏矩阵压缩存储方法。

它使用三个数组分别存储非零元素的值、行索引和列索引。

例如,对于矩阵:1 0 00 2 03 0 4COO格式可以表示为:values = [1, 2, 3, 4]rows = [0, 1, 2, 2]cols = [0, 1, 0, 2]CSR格式CSR(Compressed Sparse Row)格式是一种常用的稀疏矩阵压缩存储方法。

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

例如,对于矩阵:1 0 00 2 03 0 4CSR格式可以表示为:values = [1, 2, 3, 4]row_ptrs = [0, -1, -1, -1] # 第一个非零元素在values中的位置cols = [0, -1, -1, -1] # 列索引CSC格式CSC(Compressed Sparse Column)格式与CSR格式类似,只是将行和列交换。

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

其他压缩存储方法除了COO、CSR和CSC格式,还有其他一些矩阵压缩存储方法,如LIL(List of Lists)格式、DOK(Dictionary of Keys)格式等。

矩阵的压缩存储

矩阵的压缩存储

二、稀疏矩阵的压缩存储
若矩阵中非零元素较少(非零元 素的个数栈元素总数的20%以 下),且分布没有明显的规律
1.三元组表示法 2.十字链表存储
1.三元组表示法
将其中的非零元素在一维数组空间中以行序为主序进行存储,在存储 非零元素的同时还要存储元素所在的行和列的位置 。
非零元素所在的行号、列号和元素值
4×4三角矩阵
存储结构
3.对角矩阵
若矩阵中所有的非零元素都集中在以对角线为中心的带状区域中,则 这类矩阵称为对角矩阵。
最常见的是三对角矩阵
存储 结构
存储方法:采用一维数组,对非零 元素按行顺序存储;n阶三对角矩 阵需要3n-2个元素的存储空间。
LOC(aij)=LOC(a11)+2(i-1)+j-1
int m, n, t;
//矩阵行数、列数和非零元素个数
}TSMatrix;
2.十字链表存储
当矩阵进行某些运算时,如加法、减法和乘法等,矩阵中非零元素的 个数和位置会发生很大的变化,适用链式存储结构——十字链表。 每个非零元素用一个结点表示,每个结点由5个域组成。
同一列中下一个非零元素的位置
同一行中下一个非零元素的位置
4×4对称矩阵
存储结构
用一维数组空间作为对n阶对称矩阵A的存储结构,则矩阵中任意元素 aij在一维数组中的位置为:
2.三角矩阵
若n阶矩阵A的上(或下)三角(不包括对角线)中的元素均为常数c或 零,则称矩阵A 为下(或上)三角矩阵。
三角矩阵存储方法: 用一个一维数组来存储其下(上)三角中的元素,除此之外,当上 (下)三角中的常数不为0时,还要增加一个常数c的存储空间。
存储结构
三元组表示法的类型定ห้องสมุดไป่ตู้:

矩阵压缩存储实验报告

矩阵压缩存储实验报告

一、实验目的1. 理解并掌握矩阵压缩存储的基本原理和方法。

2. 学习针对不同类型矩阵(对称矩阵、三角矩阵、稀疏矩阵)的压缩存储技术。

3. 通过编程实现矩阵压缩存储,并验证其正确性和效率。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 实验数据:随机生成的矩阵数据三、实验内容本次实验主要针对以下三种特殊矩阵的压缩存储进行实验:1. 对称矩阵2. 三角矩阵(上三角矩阵和下三角矩阵)3. 稀疏矩阵四、实验步骤1. 对称矩阵压缩存储- 设计一个对称矩阵的结构体,包含矩阵的行数、列数以及压缩后的数组。

- 实现一个函数,将输入的对称矩阵压缩存储到一维数组中。

- 实现一个函数,根据一维数组中的元素索引还原对称矩阵。

2. 三角矩阵压缩存储- 设计一个三角矩阵的结构体,包含矩阵的行数、列数以及压缩后的数组。

- 实现两个函数,分别用于将输入的上三角矩阵和下三角矩阵压缩存储到一维数组中。

- 实现两个函数,分别用于根据一维数组中的元素索引还原上三角矩阵和下三角矩阵。

3. 稀疏矩阵压缩存储- 设计一个稀疏矩阵的结构体,包含矩阵的行数、列数、非零元素个数以及压缩后的数组。

- 实现一个函数,将输入的稀疏矩阵压缩存储到一维数组中。

- 实现一个函数,根据一维数组中的元素索引还原稀疏矩阵。

五、实验结果与分析1. 对称矩阵压缩存储- 实验结果:成功将输入的对称矩阵压缩存储到一维数组中,并可以正确还原。

- 分析:对称矩阵压缩存储可以节省约50%的存储空间。

2. 三角矩阵压缩存储- 实验结果:成功将输入的上三角矩阵和下三角矩阵压缩存储到一维数组中,并可以正确还原。

- 分析:三角矩阵压缩存储可以节省约75%的存储空间。

3. 稀疏矩阵压缩存储- 实验结果:成功将输入的稀疏矩阵压缩存储到一维数组中,并可以正确还原。

- 分析:稀疏矩阵压缩存储可以大大节省存储空间,提高矩阵运算的效率。

最新数据结构实验五矩阵的压缩存储与运算

最新数据结构实验五矩阵的压缩存储与运算

精品资料数据结构实验五矩阵的压缩存储与运算........................................第五章矩阵的压缩存储与运算【实验目的】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 23 …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= 。

矩阵的存储及转置算法

矩阵的存储及转置算法

矩阵的存储及转置算法矩阵是数学中一个重要的概念,它由一个数的方阵组成,可以用于表示线性变换、线性方程组的系数矩阵等。

在实际应用中,矩阵的存储和转置算法是非常关键的。

矩阵的存储可以有多种方式,常用的有行优先和列优先两种方式,它们分别对应于矩阵的行主序和列主序存储。

在行优先存储方式下,矩阵的元素按照行的顺序进行存储,而在列优先存储方式下,矩阵的元素按照列的顺序进行存储。

行主序存储方式可以有效地利用缓存,可以提高矩阵运算的效率,但是在进行矩阵转置操作时,会导致缓存未命中,降低算法的效率。

而列主序存储方式在进行矩阵转置操作时可以利用缓存,提高算法的效率。

因此,在实际应用中,选择合适的存储方式对于提高算法效率非常重要。

矩阵的转置是指将矩阵的行变为列,列变为行。

矩阵的转置操作可以写成下面的公式:A^T[i][j]=A[j][i]其中A表示原始矩阵,A^T表示转置矩阵,[i][j]表示第i行第j列元素。

对于存储方式为行优先的矩阵,转置算法可以按照下面的步骤进行:1.创建一个新的矩阵B,行数等于原始矩阵A的列数,列数等于原始矩阵A的行数。

2.遍历原始矩阵A的所有元素,将该元素放入新矩阵B对应的位置,即A[i][j]变为B[j][i]。

3.返回新矩阵B作为转置矩阵。

对于存储方式为列优先的矩阵,转置算法可以按照下面的步骤进行:1.遍历原始矩阵A的所有元素,从第一列开始,依次将每列的元素放入新矩阵B对应的位置,即A[i][j]变为B[j][i]。

2.返回新矩阵B作为转置矩阵。

需要注意的是,在使用列优先存储方式时,可以直接将原始矩阵的元素复制到新矩阵的对应位置,而无需额外的空间。

综上所述,矩阵的存储和转置算法是非常重要的。

在实际应用中,选择合适的存储方式可以提高算法的效率,而转置操作可以改变矩阵的存储方式,从而改变算法的效率。

因此,了解矩阵的存储和转置算法对于优化矩阵运算非常重要。

矩阵压缩存储

矩阵压缩存储

矩阵压缩存储矩阵压缩存储是一种将矩阵中的数据进行压缩存储的方法,可以大大减小矩阵所占用的存储空间,提高数据存储和传输的效率。

矩阵压缩存储的实现方式有很多种,其中比较常见的有行压缩存储和列压缩存储。

行压缩存储是将矩阵中的每一行数据进行压缩存储,对于每一行数据,只存储其中非零元素的值和它们在该行中的位置。

这种方式适用于矩阵中非零元素比较稀疏的情况,可以大大减小存储空间。

例如,对于一个5*5的矩阵:1 0 0 0 00 2 0 0 00 0 3 0 00 0 0 4 00 0 0 0 5使用行压缩存储方式,可以将其压缩为:1 12 23 34 4 51 2 2 3 4 5其中第一行表示非零元素的值,第二行表示它们在该行中的位置。

列压缩存储是将矩阵中的每一列数据进行压缩存储,对于每一列数据,只存储其中非零元素的值和它们在该列中的位置。

这种方式适用于矩阵中非零元素比较密集的情况,可以大大减小存储空间。

例如,对于同样的5*5的矩阵:1 0 0 0 00 2 0 0 00 0 3 0 00 0 0 4 00 0 0 0 5使用列压缩存储方式,可以将其压缩为:1 2 3 4 51 2 3 4 51 2 3 4 51 2 4 51 5其中第一行表示非零元素的值,第二行表示它们在该列中的位置。

矩阵压缩存储的优点在于可以大大减小存储空间,提高数据存储和传输的效率。

但是,它也存在一些缺点。

首先,对于非零元素比较密集的矩阵,行压缩存储的效果不如列压缩存储,反之亦然。

其次,矩阵压缩存储需要进行解压缩操作才能得到原始数据,这会增加一定的计算量和时间成本。

最后,矩阵压缩存储的实现需要考虑到数据的稀疏性和分布情况,否则可能会导致存储空间的浪费或者解压缩效率的降低。

总之,矩阵压缩存储是一种非常实用的数据存储和传输方式,可以大大提高数据处理的效率和速度。

在实际应用中,需要根据具体情况选择合适的压缩方式,并进行适当的优化和调整,以达到最佳的效果。

高中信息技术 竞赛班数据结构专项培训教程 05矩阵的压缩存储教案

高中信息技术 竞赛班数据结构专项培训教程 05矩阵的压缩存储教案

§5 矩阵的压缩存储§5.1 特殊矩阵§5.1.1 三角矩阵与对称矩阵设有矩阵A : array [1..n , 1..n] of Atype ; 三角矩阵:若A 的对角线以上(或以下)的元素均为零。

对称矩阵:若A 中的元素满足: a ij = a ji (1≤i ,j ≤n ), 则称为n 阶对称矩阵。

为了节省存储空间,三角矩阵和对称矩阵都不需存储对角线以上(或以下)的元素,一般采用一维数组的结构。

此时需要 个元素的存储空间。

若将上三角矩阵中的元素按行顺序存储到V 中,则V[k]与A[i, j]的对应关系是: k = ①若将下三角矩阵中的元素按行顺序存储到V 中,则V[k]与A[i, j]的对应关系是: k= ②§5.1.2 带状矩阵在n ×n 的矩阵中,若所有非零元素均集中在以对角线为中的带状区中,该带状区包括主对角线上面和下面各k 条对角线以及主对角线上的元素,这种矩阵称带状矩阵。

a 11 0 00 0 a 21 a 22 0 0 0 a 31 a 32 a 33 0 0 a 41 a 42 a 43 a 44 0 a 51 a 52 a 53 a 54 a 55 上三角矩阵 a 11 a 12 a 13 a 14 a 15 a 21 a 22 a 23 a 24 a 25 a 31 a 32 a 33 a 34 a 35 a 41 a 42 a 43 a 44 a 45 a 51 a 52 a 53 a 54 a 55 对称矩阵V a 11 a 12 a 13 a 14 a 15 0 a 22 a 23 a 24 a 25 0 0 a 33 a 34 a 35 0 0 0 a 44 a 450 0 00 a 55下三角矩阵11 2 3 0 0 0 4 2 10 13 0 05 12 76 8 0 0 20 17 9 11 15 0 0 6 1 14 21 0 0 0 2 18 3 k=2的带状矩阵 主对角线k 条对角线k 条对角线在带状矩阵A 中,i – j > k 或 ③ 时,A[ i , j ] = 0 。

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

第五章矩阵的压缩存储与运算【实验目的】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。

图5-3 三对角矩阵A与下三角矩阵的存储一样,我们也可以用一个一维数组ma[0..3n-2]来存放三对角矩阵A,其对应关系见图5-4。

a00 a01 a10 a11 a12 … an-1,n-2 an-1,n-1k= 0 1 2 3 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; //用户自定义typedef struct{ //定义三元组int i; //非零元的行下标int j; //非零元的列下标Datatype v; //非零元的数据值}TriTupleNode;typedef struct{TriTupleNode data[MaxSize]; //非零元的三元组表int m,n,t; //矩阵行,列及三元组表长度}TriTupleTable;2. 十字链表当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表,采用纵横交叉的十字链表就比较好。

在十字链表中,每个非零元可用一个含五个域的结点表示,其中i, j和e三个域分别表示该非零元所在的行、列和非零元的值,向右域right用以链接同一行中下一个非零元。

向下域down用以链接同一列中下一个非零元。

同一行中的非零元通过right域链接成一个线性链表,每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,故称这样的存储结构为十字链表,如图5-5所示。

图5-5 稀疏矩阵M的十字链表typedef int Datatype; //用户自定义typedef struct OLNode{int i,j; //该非零元的行和列下标Datatype v;Struct OLNode *right,*down //该非零元所在行表和列表的后继链域}OLNode;*OLink;typedef struct {OLink *rhead,*cheadint mu,nu,tu;}CrossList;第二节用三元组表实现稀疏矩阵的基本操作【问题描述】用三元组表实现稀疏矩阵的按列转置。

【数据描述】typedef int Datatype; //用户自定义typedef struct{ //定义三元组int i,j; // 非零元素的行下标和列下标Datatype v;}TriTupleNode;typedef struct{ //定义三元组表TriTupleNode data[MaxSize];int m,n,t; //矩阵行,列及三元组表长度}TriTupleTable;【算法描述】按照列序来进行转置。

为了找到每一列中所有的非零元素,需要对其三元组表从第一行起整个扫描一遍。

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>#include <string.h>#define Ok 1#define Maxsize 10 //用户自定义三元组最大长度typedef struct{ /*定义三元组表*/int i,j;int v;}TriTupleNode;typedef struct{ /*定义三元组表*/TriTupleNode data[Maxsize];int m;int n;int t; /*矩阵行,列及三元组表长度*/}TriTupleTable;void InitTriTupleNode (TriTupleTable *a){ /*输入三元组表*/ int 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);printf("input col \n");scanf("%d",&j);printf("input value\n");scanf("%d",&val);a->data[k].i=i;a->data[k].j=j;a->data[k].v=val;if (maxrow<i) maxrow=i;if (maxcol<j) maxcol=j;}a->m=maxrow;a->n=maxcol;a->t=k-1;}void showMatrix(TriTupleTable *a){ /*输出稀疏矩阵*/ int p,q;int t=0;for(p=1;p<=a->m;p++){for(q=1;q<=a->n;q++){ if (a->data[t].i==p&&a->data[t].j==q){printf("%d ",a->data[t].v);t++;}else printf("0 ");}printf("\n" );}}TransposeSMatrix(TriTupleTable *a,TriTupleTable *b){int q,col,p;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;}}void main( void){TriTupleTable *a,*b;InitTriTupleNode(a);showMatrix(a); /*转置前*/TransposeSMatrix(a,b);showMatrix(b); /*转置后*/}【测试数据】输入:输出:1 2 0 0 1 4 04 3 0 7 2 3 00 0 0 8 0 0 00 7 8【说明】分析算法,主要的工作是在p和col的两重循环中完成,算法的时间复杂度为O(n*t)。

如果非零元素个数t 和m*n同数量级时,算法的时间复杂度变为O(m*n2)。

【实验题】1. 稀疏矩阵按行序进行转置。

2. 两个稀疏矩阵的相加运算。

第三节十字链表表示稀疏矩阵的基本操作【问题描述】两个相同行数和列数的稀疏矩阵用十字链表实现加法运算【数据描述】typedef struct ele {/* 十字链表结点类型*/int row, col;double val;struct ele *right, *down;}eleNode;【算法描述】(1) 若q->j>v->j,则需要在C矩阵的链表中插入一个值为bij的结点,,修改v=v->right。

相关文档
最新文档