COO、CSR、adj_coo、adj_csr详解:稀疏矩阵与稀疏邻接矩阵的存储格式及转换

2023-10-04 15:16

本文主要是介绍COO、CSR、adj_coo、adj_csr详解:稀疏矩阵与稀疏邻接矩阵的存储格式及转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、COO
  • 二、CSR
  • 三、adj_coo
  • 四、adj_csr
  • 五、格式转换代码

稀疏图:数据结构中对于稀疏图的定义为:有很少条边或弧(边的条数 ∣ E ∣ |E| E 远小于 ∣ V ∣ 2 |V|^2 V2)的图称为稀疏图,反之边的条数 ∣ E ∣ |E| E 接近 ∣ V ∣ 2 |V|^2 V2,称为稠密图。采用直观的办法来存储图往往会造成极大的空间浪费,因此需要采取其他方式压缩存储空间。

一、COO

  1. 对于稠密图,我们往往以矩阵的方式存储结点的连接关系。如图1a所示,对于矩阵 matrixmatrix[i][j] = x 表示结点 i 与结点 j 之间的边的长度为 x。我们可以看到在图1a的矩阵 matrix 中,除了少数结点间有边相连,大多数的存储空间都浪费了
  2. 对于稀疏图,最直观的压缩存储方式是只存储矩阵 matrix 中的非零元素以及这些元素的位置,也就是以三元组的方式存储 (i, j, x)(i, j, x) 同样表示结点 i 与结点 j 之间的边的长度为 x,如图1b所示。
  3. 使所有三元组的横坐标单独组成 row 数组,纵坐标单独组成 column 数组,数值单独组成 data 数组就形成了稀疏矩阵的 COO表示,如图1c所示。

图1

图1 COO表示

二、CSR

  1. 对于结点数量比较多,并且远大于边数量的稀疏矩阵,上一小节中介绍的COO表示已经能够节省很多存储空间了,那我们还能不能进一步节省更多的空间呢?
  2. 当然可以!我们观察上一小节中得到的 COO表示(如图2b所示),row 数组中各三元组的横坐标 按序排列,因此 相同的横坐标会连在一起,这何尝不是一种 数据重复
  3. 我们保持 column 数组和 data 数组 不变。将 row 数组改为 row offsets:不再记录每一个元素的横坐标,只记录每一行的第一个元素在 data 数组中的下标,最后再额外记录总的元素个数。如图2c所示。
    • 新的数组 row offsets 就像书签一样,其中的第 i 个元素 ro[i]就代表了 data[ro[i]]data[ro[i+1]] 之间的元素的横坐标为 i(包括data[ro[i]] 但不包括 data[ro[i+1]])。
    • 如图2中,我们分别用蓝、黄、绿、橙代表不同的四行的元素。
      0 行的第一个元素为6,data 数组中其下标为 0,故 ro[0]=0
      1 行的第一个元素为3,data 数组中其下标为 2,故 ro[1]=2
      2 行的第一个元素为5,data 数组中其下标为 4,故 ro[2]=4
      3 行的第一个元素为7,data 数组中其下标为 5,故 ro[3]=5
      data 数组中共有 7 个元素,故 ro[4]=7

图2

图2 CSR表示

三、adj_coo

第一小节中我们讨论了普通稀疏图的矩阵转化为COO表示。但如果邻接矩阵中只记录了两个结点是否相连,并没有记录边的信息(如图3a),我们便不需要记录 data 数据,如此可以进一步压缩存储空间。
图3

图3 adj_coo表示

四、adj_csr

与adj_coo情况类似,如果邻接矩阵中只记录了两个结点是否相连,并没有记录边的信息(如图4a),我们便不需要记录 data 数据,如此可以进一步压缩存储空间。
图4

图4 adj_csr表示

五、格式转换代码

这里仅展示 adj_coo 转 adj_csr 的代码:

def adjcoo2adjcsr(adj_coo, node_count):sour = adj_coo[0]dist = adj_coo[1]adjs = []last = -1for i in range(node_count):try:index = sour.index(i)except:index = last + 1else:last = indexfinally:adjs.append(index)adjs.append(len(dist))print(adjs)print(dist)adj_coo = [[0, 0, 1, 1, 2, 3, 3],[0, 1, 1, 2, 0, 2, 3]]
adjcoo2adjcsr(adj_coo, 4)

运行结果如下图所示:
图五

这篇关于COO、CSR、adj_coo、adj_csr详解:稀疏矩阵与稀疏邻接矩阵的存储格式及转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2259

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2