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

这篇具有很好参考价值的文章主要介绍了[数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果:
1、编写程序任意输入一个稀疏矩阵,用三元组顺序表压缩存储稀疏矩阵
2、对稀疏矩阵进行转置输出转置后的矩阵。


实验目的

对应《数据结构(C语言版)》 第5章 数组与广义表 实验:

1、 掌握下三角矩阵的输入、输出、压缩存储算法;
2、 理解稀疏矩阵的三元组表类型定义
3、 掌握稀疏矩阵的输入、输出、转置算法。


一、基本概念

o(* ̄︶ ̄*)o请先确保理清一下概念

1.稀疏矩阵

假设m*n的矩阵中,有t的非零元,令s=t/m * n,当,s<=0.05时,称此矩阵为稀疏矩阵,简单理解就是非零元特别少的矩阵

//一般矩阵a
    1 2 3
 a= 4 5 6
    7 8 9
    
//稀疏矩阵s
    0 0 0 0 0 
    0 2 0 0 5
 s= 0 0 3 0 0
    0 0 0 0 4

2.矩阵转置

矩阵的转置实际上就是将数据元素的行标和列标互换,即 T(i,j) = M(j,i)
[数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

对应三元组的转置
[数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)

3.快速转置算法

矩阵的转置过程经历了三个步骤:

  • 矩阵的行数 n 和列数 m 的值交换;
  • 将三元组中的 i 和 j 调换;
  • 转换之后的表同样按照行序(置换前的列序)为主序,进行排序;【两者不同之处】

快速转置算法,预先确定矩阵M中每一列的第一个非零元在转置的三元组中的位置。

时间复杂度由O(nu * tu)提升到O(nu + tu),尤其是在矩阵的非零元个数tu与mu * nu数量级越接近时差别越明显!

二、完整代码(附详细注释)

提示:本实验环境为VS2019(‾◡◝)

代码如下(示例):

//Matrix.cpp
//任意输入一个稀疏矩阵,并输出其转置矩阵
#include <stdio.h>
#include <stdlib.h>
#include "SparseMatrix.h"

void TransposeSMatrix(TSMatrix M, TSMatrix& T);
void FastTransposeSMatrix(TSMatrix M, TSMatrix& T);

int main()
{
    TSMatrix M,T;
    //创建稀疏矩阵
    CreateSMartrix(M);
    PrintSMatrix(M);

    printf("1.普通转置\t2.快速转置\t3.退出\n");
    printf("请选择对矩阵的操作:\n");
    int choice = 1;
    while (scanf_s("%d", &choice)) {
        switch (choice) {
        case 1:
            //转置
            TransposeSMatrix(M, T);
            PrintSMatrix(T);
            printf("是否继续操作:");
            break;
        case 2:
            //快速转置
            FastTransposeSMatrix(M, T);
            PrintSMatrix(T);
            printf("是否继续操作:");
            break;
        default:
            printf("程序结束");
            exit(0);          
        }
    }
    return 0;
}

//普通转置,按照三元组在转置矩阵中的存储位置转换
void TransposeSMatrix(TSMatrix M, TSMatrix& T) {
    T.mu = M.mu;//行数
    T.nu = M.nu;//列数
    T.tu = M.tu;//非零元的个数
    if (T.tu) {
        int q = 1;
        for (int col = 1; col <= M.mu; ++col) {
            for (int p = 1; p <= M.nu; ++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;
                }
            }
        }
    }
}

//快速转置,按照三元组在原矩阵中的位置转换
//即预先确定M中每一列的第一个元素所在的位置
void FastTransposeSMatrix(TSMatrix M, TSMatrix& T) {
    T.mu = M.mu;//行数
    T.nu = M.nu;//列数
    T.tu = M.tu;//非零元的个数
    int* num = (int*)malloc(M.nu * sizeof(int));//num[col]表示矩阵M中第col列中的非零元素的个数
    int* cpot = (int*)malloc(M.nu * sizeof(int));//cpot[col]指示M中第col列的第一个非零元素在T的位置
    int q, col;
    if (T.tu) {//当矩阵不是零矩阵的时候执行操作
        for (col = 1; col <= M.nu; ++col)
            num[col] = 0;//初始化全部设置为0
        for (int t = 1; t <= M.tu; ++t)
            ++num[M.data[t].j];//按创建三元组的顺序,每列有非零元素时num加一
        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) {
            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];
        }
    }
}

//SparseMatrix.h
#pragma once
#define MAXSIZE 12500 //非零元最大个数

//三元组
typedef struct {
	int i, j;//该元素的行、列
	int e;//该元素的值,此例为整型
}Triple;

//稀疏矩阵
typedef struct {
	Triple data[MAXSIZE + 1];//非零元素三元组,data[0]未用,即矩阵的第一个元素坐标表示为(1,1)
	int mu, nu, tu;//稀疏矩阵的行、列、非零元的个数
}TSMatrix;


//创建稀疏矩阵,采用三元组顺序压缩存储的方式
void CreateSMartrix(TSMatrix& M) {
	printf("请依次输入矩阵的大小:\n行数m\t列数n\t非零元个数t\n");
	int m, n, t;
	scanf_s("%d\t%d\t%d", & m, &n, &t);
	M.mu = m;
	M.nu = n;
	M.tu = t;

	printf("请依次输入矩阵非零元的三元组:\n行坐标i\t列坐标j\t元素值e\n");
	int i, j, e;
	for (int i = 1; i <= t; i++)
	{
		scanf_s("%d\t%d\t%d", &i, &j, &e);
		M.data[i].i = i;
		M.data[i].j = j;
		M.data[i].e = e;
	}
}

//输出稀疏矩阵
void PrintSMatrix(TSMatrix M)
{
	printf("------------------------------\n");
	printf("矩阵的三元组表示:\n");
	printf("i\tj\te\n");
	for (int i = 1; i <= M.tu; i++)
	{
		printf("%d\t%d\t%d\n", M.data[i].i, M.data[i].j, M.data[i].e);
	}
	printf("------------------------------\n");
}

题外话

☆*: .。. o(≧▽≦)o .。.:*☆
最近在学习数据结构😉
也想通过写文章锻炼锻炼自己🤣
之后会持续更新后续上机实验的(暗示😶‍🌫️)
不足的地方希望友友们指正,欢迎和我讨论呀😁文章来源地址https://www.toymoban.com/news/detail-435123.html

到了这里,关于[数据结构(C语言版本)上机实验]稀疏矩阵的三元组顺序表压缩存储以及转置实现(含快速转置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

      图采用邻接表存储结构,编程实现图的深度优先搜索和广度优先搜索算法。              2.1创建图 2.1.1定义图的顶点、边及类定义   我们定义一个 邻接表类(ALGraph) 。这里实现一些基础的数据结构。要注意结构体的嵌套。    Edge: 用于表示图中的边

    2024年02月04日
    浏览(54)
  • 【数据结构】稀疏矩阵的压缩存储(三元组表、十字链表)(C语言)

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

    2023年04月16日
    浏览(42)
  • 数组:矩阵快速转置 矩阵相加 三元组顺序表/三元矩阵 随机生成稀疏矩阵 压缩矩阵【C语言,数据结构】(内含源代码)

    目录 题目: 题目分析: 概要设计: 二维矩阵数据结构: 三元数组三元顺序表顺序表结构: 详细设计: 三元矩阵相加: 三元矩阵快速转置: 调试分析: 用户手册: 测试结果:  源代码: 主程序:  头文件SparseMatrix.h:  头文件Triple.h: 总结: 稀疏矩阵A,B均采用 三元组

    2023年04月26日
    浏览(63)
  • 数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

       建立一棵二叉树,试编程实现二叉树的如下基本操作。    1.创建一棵一棵二叉算法。    2.对这棵二叉树进行遍历:先序或中序或后序,分别输出结点的遍历序列。    3.求二叉树的深度/节点数目/叶节点数目。(选做一个)    4.计算二叉树中度为1 的结点数;

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

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

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

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

    2024年02月03日
    浏览(40)
  • 【Dev-c++】C语言数据结构实验——线性表

    实验一 线性表 一、实验目的     1、深刻理解线性结构的特点,以及在计算机内的两种存储结构。     2、熟练掌握线性表的顺序存储结构和链式存储结构,及其它们的基本操作,重点掌握查找、插入和删除等操作。 二、实验要求     1、认真阅读程序, 将未完成的代码补

    2024年02月07日
    浏览(42)
  • c语言数据结构实验:链表实现学生信息的储存

    进入正题 本文作者同为大一新生,写这篇文章的目的是记录自己的学习经历,以及帮助一些稍有困难的同学理解数据结构,能力有限,如有错误请指出。本文基于严蔚敏老师的《数据结构与算法(c语言版 第二版)》创作。(建议学习的时候搭配着书看) 学习前提 : 1.本文

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

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

    2024年02月02日
    浏览(53)
  • 数据结构与算法(一): 稀疏数组

    在五子棋游戏或类似的游戏中,我们可以把整个棋盘想象成是一个有规律的二维数组,其值由0、1、2三个数字组成,0代表空白区域,1代表白子,2代表黑子。这种情况:即当一个数组中大部分元素为0或者为同一值时,存储该数组数据可以使用稀疏数组来对原始数组进行精简,

    2024年02月11日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包