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

news2024/12/23 23:00:37

文章目录

  • 一、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 = -1
    for i in range(node_count):
        try:
            index = sour.index(i)
        except:
            index = last + 1
        else:
            last = index
        finally:
            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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 231.2的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数 x 使得 n 2x ,则认为 n 是 2 的幂次方。 示例 1: 输入:n 1 输出:tr…

vs2015 报错“无法找到要定向的合适SDK”

关于Visual Studio:找不到合适的SDK来定位 | 码农家园 报错如下: 解决如下:

在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…

办公网络构建

办公网络项目背景 XX州市益智软件科技有限公司是XX市第九职业技术学校校办企业,依托学校人力技术、场地资源,面向市场独立经营、服务社会,主要从事网络设备销售、网络综合布线与网络管理。该公司现租用实训基地二层作为公司的办公经营场地…

为何需关注各ZKP方案的benchmarks?

1. 引言 近期,研究人员和工程人员有大量关于谁是最好的证明系统的争论: 2023年8月29日,StarkWare团队对比了FRI和KZG2023年8月30日,JustinThaler和Srinath Setty讨论FRI和KZG谁的性能更佳? 不过,在深入be…

小谈设计模式(17)—状态模式

小谈设计模式(17)—状态模式 专栏介绍专栏地址专栏介绍 状态模式关键角色上下文(Context)抽象状态(State)具体状态(Concrete State) 核心思想Java程序实现首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRe…

IIC控制器(2):PS端

书接上文: I2C控制器练习(1)_NoNoUnknow的博客-CSDN博客 SPI协议与FPGA的自动升级和多启动-CSDN博客 本文主要做一些基本知识的补充和工程参考。 写IIC需要注意的事情: 1.查询芯片手册获得slave地址,以及寄存器地址…

『力扣每日一题12』:只出现一次的数字

一、题目 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入&…

MySQL备份恢复

MySQL日志管理 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了。 MySQL日志类型 日志类型计入文件中的信息类型错误日志记录启…

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)

目录 前言 运行结果: 运行截屏(p50e) apk文件 源码文件 项目结构 总览 MainActivity.java drawable 更改图标的方法: blackbutton.xml bluebuttons.xml greybutton.xml orangebuttons.xml whitebutton.xml layout 布…

uniapp项目实践总结(二十七)苹果应用商店上架教程

导语:之前介绍了如何打包一个苹果安装包文件,如果想要上架苹果 ios 应用商店,那么就来这里学习一下方法吧。 目录 准备材料上架步骤审核事项 准备材料 基本信息 构建版本:需要一个 ipa 格式安装包;logo&#xff1a…

YOLOv5、YOLOv8改进:RepVGG结构

1.简介 论文参考:最新RepVGG结构: Paper 我们所说的“VGG式”指的是: 没有任何分支结构。即通常所说的plain或feed-forward架构。 仅使用3x3卷积。 仅使用ReLU作为激活函数。 主要创新点为结构重参数化。在训练时,网络的结构是多分支进…

计数排序详解

个人主页:Lei宝啊 愿所有美好如期而遇 前言 这种排序在部分情境下出奇地好,也是一种不错的排序 思路 有一个无序数组,我们从中找到最小和最大的数,最大的数减最小的数1的大小就是我们将要新建数组的大小,这个新建数…

14链表-环形链表、龟兔赛跑算法

目录 LeetCode之路——141. 环形链表 分析: 解法一:哈希表 解法二:龟兔赛跑 LeetCode之路——141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针…

美团外卖优惠券小程序 美团优惠券微信小程序 自带流量主模式 带教程

小程序带举牌小人带菜谱流量主模式,挺多外卖小程序的,但是都没有搭建教程 搭建: 1、下载源码,去微信公众平台注册自己的账号 2、解压到桌面 3、打开微信开发者工具添加小程序-把解压的源码添加进去-appid改成自己小程序的 4、…

第十七章:Java连接数据库jdbc(java和myql数据库连接)

1.进入命令行:输入cmd,以管理员身份运行 windowsr 2.登录mysql 3.创建库和表 4.使用Java命令查询数据库操作 添加包 导入包的快捷键 选择第四个 找到包的位置 导入成功 创建java项目 二:连接数据库: 第一步:注册驱动…

单层神经网络

神经网络 人工神经网络(Artificial Neural Network,ANN),简称神经网络(Neural Network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。1943年,McCulloc…

软件工程从理论到实践客观题汇总(头歌第九章至第十七章)

九、软件体系结构设计 1、软件体系结构设计概述 2、软件体系结构模型的表示方法 3、软件体系结构设计过程 4、设计初步的软件体系结构 5、重用已有软件资源 6、精化软件体系结构 7、设计软件部署模型 8、文档化和评审软件体系结构设计 十、软件用户界面设计 1、用户界面设计概…

十四天学会C++之第四天(面向对象编程基础)

类和对象是什么? 在C中,类是一种用户定义的数据类型,它可以包含数据成员(也就是属性)和成员函数(也就是方法)。类是一种模板或蓝图,用于创建具体的对象。 对象是类的实例&#xff…

【C++类和对象】:构造函数、析构函数、拷贝构造函数、赋值运算符重载

【C类和对象】:构造函数、析构函数、拷贝构造函数、赋值运算符重载 一、构造函数1.1 概念1.2 性质1.3 实例 二、析构函数2.1 概念2.2 性质2.3 实例 三、拷贝构造函数3.1 概念3.2 性质3.3 实例 四、赋值运算符重载4.1 运算符重载4.2 2 赋值运算符重载1. 赋值运算符重…