【数据结构】稀疏矩阵存储的三种方法及三元组表示稀疏矩阵转置算法的两种实现 —— C++

这篇具有很好参考价值的文章主要介绍了【数据结构】稀疏矩阵存储的三种方法及三元组表示稀疏矩阵转置算法的两种实现 —— C++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、十字链表

typedef struct OLNode { 
	int i, j;						// 该非零元的行和列下标 
	ElemType e;
	struct OLNode *right, *down;	// 该非零元所在行表和列表的后继链域 
}OLNode, *OLink;

typedef struct {
	OLink *rhead, *chead;			// 行和列链表头指针向量基址由CreateSMatrix分配 
	int mu, nu, tu;					// 稀疏矩阵的行数、列数和非零元个数 
}CrossList; 

稀疏矩阵如何转换成三元组表,算法,数据结构,矩阵,链表

二、三元组顺序表

1. 三元组顺序表数据结构

#define MAXSIZE 12500				// 假设非零元个数的最大值为12500
typedef struct {
	int i, j;
	ElemType e;
}Triple;

typedef struct {
	Triple data[MAXSIZE + 1];		// 非零元三元组表,data[0]未用 
	int mu, nu, tu;					// 矩阵的行数、列数和非零元个数 
}TSMatrix; 

注意:data[]中的元素是按行存储或者按列存储的,所以在将三元组逆置时,不能简单地将行列下标对换,data[]数组中元素的顺序也需要重新排列

2. 三元组表示稀疏矩阵转置算法1

// 时间复杂度为O(nu*tu) 
void transpose1(TSMatrix M, TSMatrix &T) {
	T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
	int q = 1;
	// 按照矩阵M的列序进行转置 
	for (int col = 1; col <= M.nu; ++col) {
		// 为了找到M的每一列中的所有非零元素,需要对其三元组表从第一行起整个扫描一遍 
		for (int p = 1; p <= M.tu; ++p) {
			if (M.data[p].j == 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;
				++q;
			}
		}
	}
}

3. 三元组表示稀疏矩阵转置算法2:快速转置

稀疏矩阵如何转换成三元组表,算法,数据结构,矩阵,链表

// 快速转置
// 时间复杂度 
void transpose1(TSMatrix M, TSMatrix &T) {
	T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
	
	// 求M中每一列含非零元个数 
	int num[M.nu + 1] = {0};	
	for (int t = 1; t <= M.tu; ++t) {
		++num[M.data[t].j];
	}
	
	// 求第col列中第一个非零元在T.data中的序号
	int cpot[M.nu + 1]; 
	cpot[1] = 1;
	for (col = 2; col <= M.nu; ++col) {
		cpot[col] = cpot[col - 1] + num[col - 1];
	} 
	
	for (int p = 1; p <= M.tu; ++p) {
		int col = M.data[p].j;
		int 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];
	}
}

三、行逻辑链接的顺序表

为了便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。为此,可将上节快速转置矩阵的算法中创建的,指示“行“信息的辅助数组 cpot 固定在稀疏矩阵的存储结构中。称这种“带行链接信息”的三元组表为行逻辑链接的顺序表,其类型描述如下:

typedef struct {
	Triple data[MAXSIZE + 1];		// 非零元三元组表 
	int rpos[MAXRC + 1];			// 各行第一个非零元的位置表 
	int mu, nu, tu;					// 矩阵的行数、列数和非零元个数 
}RLSMatrix; 

稀疏矩阵如何转换成三元组表,算法,数据结构,矩阵,链表
稀疏矩阵如何转换成三元组表,算法,数据结构,矩阵,链表文章来源地址https://www.toymoban.com/news/detail-752339.html

到了这里,关于【数据结构】稀疏矩阵存储的三种方法及三元组表示稀疏矩阵转置算法的两种实现 —— C++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】稀疏矩阵的压缩存储(三元组表、十字链表)(C语言)

    稀疏矩阵 是指矩阵中大多数元素为零的矩阵。从直观上讲,当非零元素个数低于总元素的30%时,这样的矩阵为稀疏矩阵。 1.1 三元组表的存储结构 稀疏矩阵的三元组表表示法是指只存储非零元素,同时存储该非零元素在矩阵中所处的行号和列号的位置信息。 为方便处理,将

    2023年04月16日
    浏览(42)
  • 【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

       Qestion:   完成用十字链表存储的稀疏矩阵的加法运算。 获取两个稀疏矩阵总有多少个非零元素,记作 cnt 。 当 cnt 不为零时一直循环,每循环一次 i++ ,也就是行循环,每循环一次就转移至下一行。 先从第一行开始循环,使得两个工作指针 p 、 q 分别指向两个稀疏矩阵

    2024年02月13日
    浏览(44)
  • 【数据结构】数组和字符串(十):稀疏矩阵的链接存储:十字链表的矩阵操作(加法、乘法、转置)

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(60)
  • 【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月06日
    浏览(55)
  • [数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

    实现效果: 1、编写程序任意 输入 一个稀疏矩阵,用 三元组顺序表 压缩存储 稀疏矩阵 。 2、对稀疏矩阵进行 转置 , 输出 转置后的矩阵。 对应《数据结构(C语言版)》 第5章 数组与广义表 实验: 1、 掌握下三角矩阵的输入、输出、压缩存储算法; 2、 理解稀疏矩阵的三元

    2024年02月03日
    浏览(45)
  • 数据结构— 数组、特殊矩阵、稀疏矩阵

    💟作者简介:大家好呀!我是 路遥叶子 ,大家可以叫我 叶子 哦! ❣️     📝个人主页:【路遥叶子的博客】 🏆博主信息: 四季轮换叶 , 一路招摇胜!      专栏 【数据结构-Java语言描述】  【安利Java零基础】 🐋希望大家多多支持😘一起进步呀!~❤️ 🌈若有帮助

    2024年02月02日
    浏览(53)
  • 【开卷数据结构 】稀疏矩阵

    🌺稀疏矩阵 🍁矩阵与稀疏矩阵的定义 🌺稀疏矩阵的转置 🍁详细思路 🍀思路一 🍀思路二 🌺稀疏矩阵的乘法 🍁详细思路 Q:什么是矩阵 A: 数学上,一个 矩阵 由 m 行 n 列的元素组成,是一个 m 行,n 列的表,m 和 n 是矩阵的 维度 。一般地,写作 mxn(读作“m乘n”)来指

    2024年01月19日
    浏览(42)
  • 数据结构——稀疏矩阵

    在矩阵中,若数据为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反的叫做稠密矩阵。 将棋盘看作一个二维数组,在棋子落盘时,要记录该棋子落下的坐标,其他坐标的值不做记录,默认为0。由于记录很多无意义的数据

    2024年02月03日
    浏览(40)
  • 稀疏矩阵的运算-加、减、乘、转置(C-数据结构)

    以三元组的形式给出输入数据,选择对应的运算后给出对应输出结果(稀疏矩阵的运算器) 页面布局就不说了,这里大概说一下各个运算模块的实现 加减法 将三元组中对应的元素行列位置进行比较,将较为靠前的元素直接放进新的三元组存储结构,位置相同的元素通过对应符

    2024年02月11日
    浏览(38)
  • 【数据结构】二叉树的三种遍历

    目录 一、数据结构 二、二叉树 三、如何遍历二叉树 数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据元素之间的关系以及对数据元素的操作。常见的数据结构包括数组、链表、栈、队列、树、图等。 数组是一种线性数据结构,它使用连续的内存空间存储

    2024年02月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包