【数据结构与算法】简单聊聊图数据的存储

news2024/10/10 12:48:41

文章目录

      • 1. 邻接矩阵(Adjacency Matrix)
      • 2. 邻接表(Adjacency List)
      • 3. 邻接多重表
      • 4. 十字链表
      • 5. 图数据库(Graph Database)

存储图数据的方法主要有几种,每种方法都有其特定的应用场景和优缺点。以下是几种常见的图数据存储方式及其优缺点:

1. 邻接矩阵(Adjacency Matrix)

tu-direct-side

存储方式
使用二维数组来存储图中顶点之间的关系。对于无权图,如果顶点i和顶点j之间有边,则在二维数组的第i行第j列位置(对于无向图,也需要在第j行第i列位置)置为1,否则置为0。对于有权图,则在相应位置存储顶点i到顶点j的权值。

优点

  • 实现简单,易于理解。
  • 支持快速判断任意两个顶点之间是否存在边(或弧)。

缺点

  • 空间复杂度高,尤其是当图为稀疏图时,会浪费大量空间。
  • 在边的查询和更新上效率较低,特别是对于大型稀疏图。

2. 邻接表(Adjacency List)

tu-list

存储方式
通过数组或链表的方式,为每个顶点存储一个链表(或其他数据结构),链表中的节点表示与该顶点相邻的顶点及其相关信息(如边的权值)。

优点

  • 空间效率高,特别适用于稀疏图,只存储实际存在的边。
  • 在边的查询和更新上效率高。

缺点

  • 对于无权图,实现上可能相对复杂,需要额外的数据结构来存储边的信息。
  • 不便于快速判断任意两个顶点之间是否存在边(或弧),需要遍历链表。

3. 邻接多重表

存储方式
主要用于存储无向图,每条边在邻接多重表中存储两次,分别属于该边的两个顶点。除了存储与顶点相邻的顶点信息外,还存储了边的信息(如是否被访问过等)。

优点

  • 节省空间,相较于邻接表存储无向图时更为高效。
  • 便于边的操作,如删除边。

缺点

  • 实现相对复杂,主要用于特定场景。

4. 十字链表

  • 结点
    graph-node
  • 链表
    请添加图片描述

存储方式
是邻接表和邻接多重表的结合体,特别适用于存储有向图。它有两个表头结点,分别指向顶点表和边表。顶点表中每个顶点节点包含顶点信息和指向第一条以该顶点为尾的边的指针;边表中每个边节点包含边的信息、指向下一条以该边起点为尾的边的指针以及指向该边起点的顶点节点。

优点

  • 便于对有向图进行顶点和边的操作。

缺点

  • 实现复杂,主要用于特定场景。

5. 图数据库(Graph Database)

存储方式
使用图结构来表示数据,其中实体被表示为节点(Node),实体之间的关系被表示为边(Edge)。图数据库特别适用于处理社交网络分析、推荐系统、生物信息学、语义网络等领域的数据。

优点

  • 能够高效地表示和查询连接的数据,支持复杂的关系查询和推理。
  • 提供了丰富的图算法库和友好的数据分析工具,使得数据分析更为方便。

缺点

  • 数据存储成本高,需要维护大量的节点和边信息。
  • 查询语言(如图查询语言Cypher、Gremlin等)相对于SQL较为复杂,用户学习成本较高。
  • 目前图数据库的技术标准尚未统一,不同的图数据库产品在数据模型、查询语言等方面存在差异。

综上所述,在选择图数据的存储方式时,需要根据实际应用场景、图的类型(如无向图、有向图、稀疏图、稠密图等)以及性能要求等多方面因素进行综合考虑。

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

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

相关文章

【工具】前端js数字金额转中文大写金额

【工具】前端js数字金额转中文大写金额 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金额转…

快递批量查询物流追踪只揽收无物流信息的单号

在电子商务和物流领域&#xff0c;快递单号的追踪是确保货物顺利送达的关键环节。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一些只显示揽收信息而没有后续物流更新的单号&#xff0c;这给商家和买家都带来了不小的困扰。本文将介绍如何通过快递批量查询物流的方法&a…

jdk多版本来回切换不生效

本人电脑安装了两个jdk1.8跟17 但是安装完17后发现怎么切换版本都是17&#xff0c;如图 解决思路也很简单&#xff0c;就是找到path 将%JAVA_HOME%/bin提到最前头&#xff0c;就解决了 但是需要注意的是jdk11以上就没有jre了

YOLO11改进|注意力机制篇| 引入SpatialGroupEnhance注意力机制

目录 一、【 SpatialGroupEnhance】注意力机制1.1【 SpatialGroupEnhance】注意力介绍1.2【SpatialGroupEnhance】核心代码 二、添加【SpatialGroupEnhance】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【 SpatialGroupEnh…

leetcode:反转字符串II

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseStr(string s, int k) {string s1;int i 0;//标记字符串下标int j 0;int length …

程序员在AI时代扮演着多重角色:不仅是AI技术的创造者,也是使用者,更是AIGC的贡献者

程序员在AI时代扮演着多重角色&#xff1a;不仅是AI技术的创造者&#xff0c;也是使用者&#xff0c;更是AIGC的贡献者 引言 大家好&#xff0c;我是猫头虎&#xff0c;在当下的AI时代&#xff0c;程序员不仅是AI技术的推动者&#xff0c;更在这个生态中扮演着多重角色&#…

ARM base instruction -- sdiv

有符号除法运算 Signed Divide divides a signed integer register value by another signed integer register value, and writes the result to the destination register. The condition flags are not affected. 将一个有符号整数寄存器值除以另一个有符号整数寄存器值&am…

YOLOv11训练自己数据集_笔记1

一、前言 官网yolov11-main yolov11代码地址 分析YOLO11的关键改进点 YOLO11 相比之前版本&#xff0c;带来了五大关键改进&#xff1a; 增强特征提取&#xff1a;通过改进Backbone和Neck架构&#xff0c;新增了C3k2和C2PSA等组件&#xff0c;提升了目标检测的精度。 优化效率…

python使用装饰器来统计函数被调用次数、格式化dict以及Python-smtplib邮件发送的IP name possibly forged问题解决

一、python调试&#xff1a;使用装饰器来统计函数被调用次数及格式化dict 喜欢调试的时候显示数据并显示一些其它的信息&#xff0c;比如区分是哪次调用的调试信息&#xff0c;比如友好的显示dict等相对复杂的数据类型&#xff0c;所以这里涉及到两个方面。一是统计函数被调用次…

Centos再生龙系统迁移

Centos再生龙系统迁移 1.准备工作1.1rufus镜像刻录软件1.2再生龙镜像1.3硬盘和U盘2.准备u盘启动工具2.1刻录再生龙镜像3.备份系统3.1选择U盘启动3.2选择分辨率3.3选择中文3.4选择默认键盘配置3.5使用再升龙3.6选择第一个,device-image硬盘/分区存到/来自镜像文件3.7选择local_…

运维问题0004:MM模块-操作MIGO过账报错“对象OFN_YR 2840 WE2840 的编码范围没有找到”

1、问题分析 当在SAP系统MM模块的MIGO过账时出现“对象OFN_YR 2840 WE2840的编码范围没有找到”错误&#xff0c;这通常是因为系统配置中缺少对应的编码范围。先来分析一下报错消息号信息&#xff1a;OFN_YR是后台自动凭证编号范围配置的事务代码;2840是工厂名称 ;WE2840是指接…

地理空间数据共享资源,爱好者进

地理空间数据共享资源&#xff0c;爱好者进 1、1986–2021年中国30m逐年耕地数据集 由于农田的空间和时间模式对食品安全和环境可持续性的供应至关重要&#xff0c;因此长期和准确的农田监测非常重要。研究团队开发了一种新颖、经济的年度农田映射框架&#xff0c;该框架集成…

【C++】适配器stack/queue/priority_queue使用和实现

目录 容器适配器 什么是容器适配器 ​编辑stack stack的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 ​编辑queue queue的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 priority_queue priority_queue的了解和使用 使用举…

基于SpringBoot项目评审系统【附源码】

基于SpringBoot项目评审系统 效果如下&#xff1a; 系统首页界面 学生登录界面 项目信息页面 项目申报页面 专家注册界面 管理员登录界面 管理员功能界面 项目评审界面 评审结果界面 研究背景 在当今快速发展的信息时代&#xff0c;项目评审作为项目管理的关键环节&#xff…

【网络】初识https协议加密过程

初识https协议加密过程 为什么不用http而要使用https常见的加密方式对称加密非对称加密数据摘要&&数据指纹 https的工作过程探究方案一&#xff1a;只使用对称加密方案二&#xff1a;只使用非对称加密方案三&#xff1a;双方都使用对称加密方案四&#xff1a;非对称加密…

毕设分享 基于协同过滤的电影推荐系统

文章目录 0 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

四、Java 概念知识简单了解

一、Java 的类、对象、方法和实例变量 一个 Java 程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。对象&#xff1a;对象是类的一个实例&#xff0c;有状态&#xff08;实例变量&#xff…

嵌入式面试——FreeRTOS篇(三) 消息队列和队列集

本篇为&#xff1a;消息队列和队列集篇 消息队列 1、FreeRTOS中的消息队列是什么 答&#xff1a; 消息队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)。 2、消息队列和全局变量的区别 答&#xff1a; 消息队列作用有点类似于全局变量&#xff0c;但消…

简单的网络爬虫爬取视频

示例代码爬取一个周杰伦相关视频 import requests# 自己想下载的视频链接 video_url https://vdept3.bdstatic.com/mda-qg8cnf4bw5x6bjs5/cae_h264/1720516251158906693/mda-qg8cnf4bw5x6bjs5.mp4?v_from_shkapp-haokan-hbf&auth_key1728497433-0-0-4a32e13f751e04754e4…

谷歌上架,应用明明没问题,咋就成了“恶意软件”?看看可能的原因

作为Google Play上架应用的开发者&#xff0c;大家的普遍感受&#xff1a;比起写代码&#xff0c;上架的过程简直更让人心力交瘁&#xff01;特别是涉及用户数据和隐私保护的时候&#xff0c;稍有疏忽&#xff0c;就可能面临应用被下架、甚至账号被封的风险。 最近听到很多开发…