稀疏矩阵的三元组

  • !!!对特殊矩阵压缩存储的介绍
  • 数据结构中对称矩阵的存储
  • 利用三元组存储稀疏矩阵
    • —— 头文件
    • 结构体声明三元组
    • 结构体声明稀疏矩阵
    • 构造增添三元组元素的函数
    • 构造展示稀疏矩阵的函数
    • —— 主函数

!!!对特殊矩阵压缩存储的介绍

数据结构中,提供针对某些特殊矩阵的压缩存储结构

此处说的特殊矩阵主要分为以下二类:

  1. 含有大量相同数据元素的矩阵,比如对称矩阵
  2. 含有大量 0 元素的矩阵,比如稀疏矩阵上(下)三角矩阵

针对以上两类矩阵,数据结构的压缩存储的思想是矩阵中相同数据元素(包括元素 0)只存储一个

数据结构中对称矩阵的存储

对称矩阵指的是各数据元素沿主对角线对称的矩阵


我们借助如下公式实现对下三角元素的存储(i 代表行,j 代表列):

最终求得的 k 值即为该元素存储到数组中的位置(令此数组为 arr)

具体求法如下!!!

  1. 第一行第一列的元素 1(i = 1,j = 1),k = 0,arr[0] = 1
  2. 第二行第一列的元素 2(i = 2,j = 1),k = 1,arr[1] = 2
  3. 第二行第二列的元素 4(i = 2,j = 2),k = 2,arr[2] = 4
  4. 第三行第一列的元素 3(i = 3,j = 1),k = 3,arr[3] = 3
  5. 第三行第二列的元素 5(i = 3,j = 2),k = 4,arr[4] = 5
  6. 第三行第三列的元素 6(i = 3,j = 3),k = 5,arr[5] = 6

同理的存储上三角元素利用另一个公式:


C语言示例!!!

#include <stdio.h>// 将对称矩阵的下三角矩阵元素存储到 arr数组中
void appendElement(int *arr, int i, int j, int data){  // i和j分别代表元素位于几行几列 int index = i*(i-1)/2 + (j-1);arr[index] = data;
}// 展示对称矩阵的元素
void showElement(int *arr, int m, int n){  // m和n分别代表行列数 int index = 0;for(int i = 1; i < m+1; i++){  // 行数 for(int j = 1; j < n+1; j++){  // 列数 // 计算对称矩阵的下三角部分(加上主对角线)if(i >= j){index = i*(i-1)/2 + (j-1);printf("%d ", arr[index]);}else{index = j*(j-1)/2 + (i-1);printf("%d ", arr[index]);}}printf("\n");}
}
int main(void){int m, n;printf("请输入矩阵的行数和列数:");  // 三行三列的对称矩阵 scanf("%d %d", &m, &n);  // 3 3// 计算 arr数组的长度 (m*n+m)/ 2 int arr_length = (m*n+m)/2;  // 6int arr[arr_length];// 补充数组appendElement(arr, 1, 1, 1);appendElement(arr, 2, 1, 2);appendElement(arr, 2, 2, 4);appendElement(arr, 3, 1, 3);appendElement(arr, 3, 2, 5);appendElement(arr, 3, 3, 6);// 展示对称矩阵showElement(arr, 3, 3); // outputs: 1 2 3//           2 4 5//         3 5 6return 0;
}

利用三元组存储稀疏矩阵

—— 头文件

#include <stdio.h>
#define number 3

结构体声明三元组

// 结构体声明三元组节点
typedef struct {int i, j;int data;
} triple;

结构体声明稀疏矩阵

// 结构体声明稀疏矩阵节点
typedef struct {triple data[number];int n, m, num;
} TSMatrix;

构造增添三元组元素的函数

int index = 0; // 全局变量(记录三元组的索引值) // 填充三元组内容
void appendElement(TSMatrix *thisM, int i, int j, int data){thisM->data[index].i = i;thisM->data[index].j = j;thisM->data[index].data = data;index++;
}

构造展示稀疏矩阵的函数

// 输出存储的稀疏矩阵
void display(TSMatrix M){for(int i = 1; i <= M.m; i++){  // 行for(int j = 1;j <= M.n; j++){  // 列int value = 0;for(int k = 0; k < M.num; k++){if(i == M.data[k].i && j == M.data[k].j){  // 证明找到非零元素 printf("%d ", M.data[k].data);  // 输出非零元素 value = 1;break;}}if(value == 0){ printf("0 ");} }printf("\n");}
}

—— 主函数

int main() {TSMatrix M;M.m = 3;  // 三行 M.n = 3;  // 三列  M.num = 3;  // 三个非零元素 // 插入三元组 appendElement(&M, 1, 1, 1);appendElement(&M, 2, 3, 5);appendElement(&M, 3, 1, 3);// 展示三元组 display(M);// outputs: 1 0 0//           0 0 5//         3 0 0return 0;
}

(数据结构)C语言稀疏矩阵存储之三元组 —— 2022/3/25相关推荐

  1. 稀疏矩阵的三元组存储方法c语言,数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现...

    陈独秀的秘密 数据结构C语言版 稀疏矩阵的三元组顺序表存储表示和实现 P98 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月8日 */ typedef int ElemType; // ...

  2. C语言实现稀疏矩阵存储和转置

    稀疏矩阵存储和转置 稀疏矩阵是矩阵中一种特别的矩阵,主要特点是:非零元素占矩阵所有元素的比例极少.那么,对于这种矩阵的存储,就存在很多很节省空间的方式,核心要点也就是舍弃那些无用元素即零元素,下面将以 ...

  3. 串的堆分配存储c语言,数据结构c语言串的堆分配存储源程序

    <数据结构c语言串的堆分配存储源程序>由会员分享,可在线阅读,更多相关<数据结构c语言串的堆分配存储源程序(7页珍藏版)>请在人人文库网上搜索. 1.include#inclu ...

  4. 以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现

    <数据结构C语言版 串的块链存储表示和实现>由会员分享,可在线阅读,更多相关<数据结构C语言版 串的块链存储表示和实现(13页珍藏版)>请在人人文库网上搜索. 1.*数据结构C ...

  5. 数据结构之三元组的实现

    数据结构之三元组的实现 思路的构建 三元组的实现 1.必要的头文件 2.相关操作集 3.主函数调用实现最终的功能 头文件 #include<malloc.h> #include<ma ...

  6. c语言稀疏矩阵运算器,数据结构:稀疏矩阵运算器

    题目:设计一个程序,实现一个能进行稀疏矩阵基本运算的计算器.按照教科书<数据结构(C语言版)>(严蔚敏等)5.3.2节中描述的方法,以十字链表表示稀疏矩阵. 一.需求分析 稀疏矩阵是指那些 ...

  7. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

  8. 数据结构c语言版习题

    数据结构c语言版习题 文章目录 第一章 绪论 第二章 线性表 第四章 串 第五章数组和广义表作业 第六章 树与二叉树理论作业 第七章图作业 第八章查找作业 第一章 绪论 一.选择题 1.以下说法正确的 ...

  9. 数据结构c语言版第16页,数据结构c语言版

    数据结构c语言版[编辑] 概述 <数据结构C语言版>本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及综合分析比较 出版信息 ...

最新文章

  1. Visual Web Development 2005开发ASP.NET使用小技巧
  2. python中的字符串常用函数
  3. 数据中心的“芯”竞争
  4. 小小总结,写得有些乱
  5. 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)...
  6. 【BZOJ3590】[Snoi2013]Quare 状压DP
  7. oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组
  8. 从啥也不会的小白,如何成为合格的算法工程师?
  9. https认证和httpclient远程调度https的接口的方法
  10. Qss设置属性不进Set函数
  11. 响应面matlab算法,结构可靠度分析的响应面法及其Matlab实现参考文件.pdf
  12. Bug 引发的 18 次重大事故
  13. Mac系统常用软件总结
  14. 边云协同的优点_边缘计算的云边协同
  15. 高性价比降噪耳机推荐,2023年降噪耳机排行榜推荐
  16. 利用pandas进行简单数据分析-医院销售数据分析案例
  17. Kindle 原生系统阅读坚排pdf扫描版电子书———基于K2pdfopt重排
  18. python repair修复功能_NI 技术支持|我的插件显示需要修复(REPAIR)了该怎么办?...
  19. 【亲测可用】豆瓣电影的API接口
  20. nat123端口映射linux,nat123 linux版下载

热门文章

  1. TkMapper扫描包的坑
  2. python qq空间 上传_Python 爬虫监控女神的QQ空间新的说说,实现秒赞,并发送说说内容到你的邮箱...
  3. JavaScript框架(一)
  4. 记一次客户端查询DNS服务器被拒绝原因查找
  5. IDEA JSP实验作业-1
  6. 内存屏障 linux,Linux中内存屏障
  7. win10修改系统默认字体
  8. AE 稳定器 跟踪运动
  9. 嵌入式UWB定位测距设备开发实战(8)硬件之数据与充电接口
  10. 数据挖掘学习之数据资源——fandango_score_comparison.csv