当前位置: 首页 > article >正文

数据结构图的存储方式:从邻接矩阵到十字链表,一文打尽

数据结构图的存储方式从邻接矩阵到十字链表一文打尽图是计算机科学中最灵活、最强大的数据结构之一。社交网络、地图导航、推荐系统……背后都离不开图。但图的存储方式直接影响算法的效率。今天我们就来彻底搞清楚图的五种存储方式。作为一名从 Java 后端转算法的开发者我深知图存储的重要性。选错了存储方式一个简单的遍历都可能从 O(n) 变成 O(n²)甚至内存爆炸。本文将从最基础的邻接矩阵讲起逐步深入到十字链表、邻接多重表等高级结构帮你建立完整的知识体系。一、图的存储到底在存什么图由顶点和边组成。存储图的核心就是存储顶点信息比如编号、数据存储边的关系谁和谁相连权重多少根据图的类型有向/无向、带权/无权、稀疏/稠密我们选择不同的存储方式。二、五种主流存储方式对比速览存储方式适用图类型空间复杂度判断边是否存在遍历邻接点备注邻接矩阵稠密图O(V²)O(1)O(V)简单直观但浪费空间邻接表稀疏图O(VE)O(degree)O(degree)最常用但删除边较慢逆邻接表有向图入边查询O(VE)O(degree)O(degree)邻接表的伴生结构十字链表有向图O(VE)O(1) 可优化O(degree)可同时遍历出边和入边邻接多重表无向图边操作频繁O(VE)O(1) 可优化O(degree)避免边的重复存储下面逐一详细讲解。三、邻接矩阵Adjacency Matrix—— 简单粗暴3.1 定义用一个 V × V 的二维矩阵M表示图。对于无权图M[i][j] 1表示顶点 i 到 j 有边M[i][j] 0表示无边对于带权图将 1 替换为权重0 替换为无穷大∞。3.2 示例无向图顶点: 0, 1, 2, 3 边: 0-1, 0-2, 1-3, 2-3 邻接矩阵 0 1 2 3 0 [ 0, 1, 1, 0 ] 1 [ 1, 0, 0, 1 ] 2 [ 1, 0, 0, 1 ] 3 [ 0, 1, 1, 0 ]3.3 优缺点优点判断两点是否有边O(1)实现简单适合稠密图缺点空间 O(V²)V10000 时矩阵有 1 亿个元素内存爆炸遍历某个顶点的所有邻接点需要 O(V)即使该顶点只有少数几个邻居3.4 Java 代码publicclassAdjacencyMatrix{privateint[][]matrix;privateintvertexCount;publicAdjacencyMatrix(intvertexCount){this.vertexCountvertexCount;matrixnewint[vertexCount][vertexCount];}// 添加边无向图publicvoidaddEdge(inti,intj){matrix[i][j]1;matrix[j][i]1;}// 判断边是否存在publicbooleanhasEdge(inti,intj){returnmatrix[i][j]1;}// 遍历顶点 v 的所有邻接点publicListIntegergetNeighbors(intv){ListIntegerneighborsnewArrayList();for(inti0;ivertexCount;i){if(matrix[v][i]1){neighbors.add(i);}}returnneighbors;}}四、邻接表Adjacency List—— 稀疏图王者4.1 定义为每个顶点维护一个链表或动态数组存储所有邻接点。对于带权图链表节点还需存储权重。4.2 示例无向图同上0 - 1 - 2 1 - 0 - 3 2 - 0 - 3 3 - 1 - 2有向图0 - 1 - 2 1 - 3 2 - 3 3 - (空)4.3 优缺点优点空间 O(VE)非常适合稀疏图|E| |V|²遍历邻接点的时间 O(degree(v))高效缺点判断边是否存在需要遍历邻接链表最坏 O(degree)删除边稍微麻烦4.4 Java 代码使用 ArrayListimportjava.util.*;publicclassAdjacencyList{privateListListIntegeradj;privateintvertexCount;publicAdjacencyList(intvertexCount){this.vertexCountvertexCount;adjnewArrayList(vertexCount);for(inti0;ivertexCount;i){adj.add(newLinkedList());}}publicvoidaddEdge(inti,intj){adj.get(i).add(j);adj.get(j).add(i);// 无向图}publicListIntegergetNeighbors(intv){returnadj.get(v);}publicbooleanhasEdge(inti,intj){returnadj.get(i).contains(j);}}五、逆邻接表Reverse Adjacency List—— 有向图的“反向索引”邻接表只能快速获取出边。如果经常需要查询哪些顶点指向我如 PageRank 算法就需要逆邻接表。实现额外维护一个reverseAdj数组每条有向边i→j同时添加到reverseAdj.get(j)中。空间仍然是 O(VE)但两倍常数。适用有向图中需要同时正向和反向遍历的场景。六、十字链表Orthogonal List—— 有向图的完美存储邻接表 逆邻接表需要两份边存储每条边被存两次。十字链表将出入边整合到一个节点中每条边只存储一次却能同时快速遍历出边和入边。6.1 节点结构顶点表data firstOut firstIn边表弧节点tailVex headVex tailLink headLink weight可选tailVex弧尾顶点下标headVex弧头顶点下标tailLink指向下一条以相同弧尾为起点的边headLink指向下一条以相同弧头为终点的边6.2 示例图解有向图0→1, 0→2, 1→3, 2→3顶点 0 的firstOut指向弧0→10→1的tailLink指向0→2。顶点 3 的firstIn指向弧1→31→3的headLink指向2→3。6.3 优点空间 O(VE)每条边只存储一次可同时高效遍历出边和入边删除边时无需在两个表中找6.4 适用场景有向图且需要频繁查询入边和出边如编译器中的依赖图、网络流算法。七、邻接多重表Adjacency Multi-list—— 无向图的边复用在无向图的邻接表中每条边会被存储两次在两个顶点的链表里。这导致删除或修改边时需要同时操作两个链表容易出错。邻接多重表让每条边只用一个节点两个顶点共享。7.1 节点结构顶点表data firstEdge边表mark vertex1 vertex2 path1 path2vertex1,vertex2边的两个顶点path1指向与vertex1相连的下一条边path2指向与vertex2相连的下一条边mark标记边是否被访问用于遍历7.2 优点每条边只存储一次节省空间删除边时只需删除一个节点操作简单适合对边频繁增删的场景7.3 适用场景无向图且边操作频繁例如最小生成树算法中动态维护边集合。八、如何选择一张决策图图是否稠密 │ ├── 是|E| ≈ |V|²→ 邻接矩阵 │ └── 否稀疏图 │ └── 是否无向图 │ ├── 是 ──→ 是否需要频繁删除边或遍历边 │ ├── 是 → 邻接多重表 │ └── 否 → 邻接表 │ └── 否有向图 │ └── 是否需要同时频繁遍历入边和出边 ├── 是 → 十字链表 └── 否 → 邻接表 可选逆邻接表九、实战建议场景推荐存储理由社交网络好友关系稀疏无向邻接表空间省遍历快地图导航有向带权稀疏邻接表或十字链表权重存储方便蛋白质相互作用网络稠密无向邻接矩阵判断连接 O(1)编译器依赖图有向十字链表同时查依赖和被依赖图算法教学演示邻接表实现简单十、总结图的存储没有银弹。理解每种方式的空间复杂度、操作效率和适用图类型才能在实际开发中做出正确选择。一句话记忆稠密用矩阵稀疏用邻接有向要双向十字链表强无向边多重删边不慌张。彩蛋Facebook 的社交图如何存储早期用邻接表因为稀疏后来发展到自研的 TAO 系统但底层思想依然离不开这些经典结构。如果你觉得有帮助欢迎点赞、收藏、转发本文首发于 CSDN未经授权禁止转载。

相关文章:

数据结构图的存储方式:从邻接矩阵到十字链表,一文打尽

数据结构图的存储方式:从邻接矩阵到十字链表,一文打尽图是计算机科学中最灵活、最强大的数据结构之一。社交网络、地图导航、推荐系统……背后都离不开图。但图的存储方式直接影响算法的效率。今天,我们就来彻底搞清楚图的五种存储方式。作为…...

zteOnu命令行工具实战指南:高效管理中兴光猫的5大核心功能

zteOnu命令行工具实战指南:高效管理中兴光猫的5大核心功能 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫作为家庭和企业网络的核心设备,其隐藏的高级…...

VLC皮肤美化终极指南:5款专业主题打造个性化播放器体验

VLC皮肤美化终极指南:5款专业主题打造个性化播放器体验 【免费下载链接】VeLoCity-Skin-for-VLC Castom skin for VLC Player 项目地址: https://gitcode.com/gh_mirrors/ve/VeLoCity-Skin-for-VLC 你是否厌倦了VLC播放器那千篇一律的默认界面?是…...

nli-MiniLM2-L6-H768多场景实战:法律文书摘要→‘合同纠纷,劳动争议,知识产权’归类

nli-MiniLM2-L6-H768多场景实战:法律文书摘要→合同纠纷,劳动争议,知识产权归类 1. 项目概述 在法律文书处理领域,快速准确地分类各类法律文件是一项基础但重要的工作。传统方法依赖人工阅读或复杂的机器学习模型训练,效率低下且成本高昂。…...

5分钟掌握Dell G15开源散热控制神器:告别官方AWCC的臃肿与卡顿

5分钟掌握Dell G15开源散热控制神器:告别官方AWCC的臃肿与卡顿 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为Dell G15笔记本的官方散热软件…...

SOCD Cleaner终极指南:5分钟解决游戏按键冲突,提升操作精度

SOCD Cleaner终极指南:5分钟解决游戏按键冲突,提升操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对决中,因为同时按下W和S键导致角色卡顿&…...

3大核心技术突破:WarcraftHelper让经典魔兽争霸3重获新生

3大核心技术突破:WarcraftHelper让经典魔兽争霸3重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款承载无数玩家记…...

RexUniNLU开箱即用体验:定义标签即识别,加速NLU应用开发

RexUniNLU开箱即用体验:定义标签即识别,加速NLU应用开发 1. 引言:当NLU遇上零样本学习 想象一下这样的场景:产品经理急匆匆地找到你,说需要在下周一上线一个智能客服原型,用于处理用户的机票预订请求。按…...

终极指南:3分钟学会用ncmdumpGUI解密网易云音乐NCM格式文件

终极指南:3分钟学会用ncmdumpGUI解密网易云音乐NCM格式文件 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的NCM加密格式文件无法…...

深度解析微软MARO:工业级多智能体资源优化框架实战指南

1. 从零到一:深度拆解微软MARO平台,一个工业级多智能体资源优化框架如果你正在寻找一个能够将强化学习(RL)从“玩具问题”推向真实工业场景的开源框架,那么微软开源的MARO(Multi-Agent Resource Optimizati…...

WebPlotDigitizer终极指南:5分钟从科研图表中提取数据的免费神器

WebPlotDigitizer终极指南:5分钟从科研图表中提取数据的免费神器 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 还在为从科…...

从零部署ToolJet:开源低代码平台构建内部工具实战指南

1. 项目概述:从零到一,用开源低代码平台构建你的第一个内部工具 如果你是一名开发者、产品经理,或者是一个小团队的负责人,大概率遇到过这样的场景:业务部门提了一个紧急需求,比如需要一个简单的数据看板来…...

从零构建ReAct智能体:基于TypeScript的LLM应用开发实践

1. 项目概述与核心思路最近在折腾大语言模型应用,发现很多框架要么太重,要么封装得太深,想改点东西都无从下手。特别是ReAct这种经典的“思考-行动”模式,虽然原理清晰,但真想自己从头实现一遍,把每个环节都…...

如何彻底解决Mac滚动方向混乱问题:Scroll Reverser终极配置指南

如何彻底解决Mac滚动方向混乱问题:Scroll Reverser终极配置指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否经常在Mac上同时使用触控板和鼠标,…...

收藏!小白程序员必备:手把手教你用Harness让大模型稳定落地生产环境

企业级AI落地常遇模型逻辑混乱、上下文丢失等问题。文章介绍Harness作为Agent运行时控制系统,通过知识层、约束与流程层、反馈与运行时层,解决模型不可控、不稳定问题。实现Agent自主执行、权限管控、闭环纠错,提升AI可靠性。文章还提供分层架…...

基于Coze-Studio:从零构建AI应用的可视化开发与生产部署全攻略

1. 项目概述:从“玩具”到“生产力”的AI应用构建平台如果你和我一样,在过去一年里尝试过各种AI应用开发平台,从早期的LangChain、Flowise,到后来的Dify、FastGPT,再到各大云厂商推出的AI开发套件,你可能会…...

解放双手的星穹铁道自动化神器:三月七小助手深度使用指南

解放双手的星穹铁道自动化神器:三月七小助手深度使用指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《崩坏:星…...

02华夏之光永存:盘古大模型开源登顶世界顶级——全栈架构深度拆解(第二篇)

华夏之光永存:盘古大模型开源登顶世界顶级——全栈架构深度拆解(第二篇) 标签:#华为盘古 #大模型架构拆解 #昇腾原生架构 #MoGE专家架构 #盘古开源技术 #大模型底层逻辑 免责声明 本文为《盘古大模型开源世界顶级保姆级全参数》系…...

百度网盘直链解析终极指南:告别限速,实现高速下载的简单方法

百度网盘直链解析终极指南:告别限速,实现高速下载的简单方法 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经面对百度网盘的下载速度限制感到…...

青龙面板依赖终极解决方案:3分钟告别“Module Not Found“错误

青龙面板依赖终极解决方案:3分钟告别"Module Not Found"错误 【免费下载链接】QLDependency 青龙面板全依赖一键安装脚本 / Qinglong Pannel Dependency Install Scripts. 项目地址: https://gitcode.com/gh_mirrors/ql/QLDependency 你是否曾经在…...

3步彻底解决:macOS多设备滚动方向混乱的终极方案

3步彻底解决:macOS多设备滚动方向混乱的终极方案 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾经在MacBook触控板和外接鼠标之间切换时,被完全…...

RTL8852BE Linux驱动终极指南:快速解决无线网卡兼容性问题

RTL8852BE Linux驱动终极指南:快速解决无线网卡兼容性问题 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统下Realtek RTL8852BE无线网卡无法正常工作而烦恼吗&…...

Blender 3MF插件:让3D打印工作流无缝衔接的完整指南

Blender 3MF插件:让3D打印工作流无缝衔接的完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在Blender中完成了精美的3D设计,准备进…...

2026-04-26:使循环数组余额非负的最少移动次数。用go语言,给定一个环形排列的数组 balance,长度为 n,其中 balance[i] 表示第 i 个人当前的净余额(正数代表有剩余,负数代

2026-04-26:使循环数组余额非负的最少移动次数。用go语言,给定一个环形排列的数组 balance,长度为 n,其中 balance[i] 表示第 i 个人当前的净余额(正数代表有剩余,负数代表欠债)。 在一次操作中…...

Xbox成就解锁终极指南:告别繁琐操作,轻松达成全成就

Xbox成就解锁终极指南:告别繁琐操作,轻松达成全成就 【免费下载链接】Xbox-Achievement-Unlocker Achievement unlocker for xbox games (barely works but it does) 项目地址: https://gitcode.com/gh_mirrors/xb/Xbox-Achievement-Unlocker 你是…...

Zotero SciPDF插件:5分钟实现学术文献PDF自动下载的终极免费方案

Zotero SciPDF插件:5分钟实现学术文献PDF自动下载的终极免费方案 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf 还在为下载学术论文PDF而烦恼吗&#xf…...

魔兽争霸3终极解决方案:WarcraftHelper让你的经典游戏焕发新生

魔兽争霸3终极解决方案:WarcraftHelper让你的经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑…...

视频字幕提取革命:如何用本地AI工具5分钟搞定10分钟视频

视频字幕提取革命:如何用本地AI工具5分钟搞定10分钟视频 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内…...

Voxtral-4B-TTS-2603参数详解:20种预设音色+语速/格式组合效果实测

Voxtral-4B-TTS-2603参数详解:20种预设音色语速/格式组合效果实测 1. 语音合成新选择:Voxtral-4B-TTS-2603介绍 Voxtral-4B-TTS-2603是Mistral最新发布的开源语音合成模型,专为需要高质量语音输出的生产环境设计。这个模型最吸引人的地方在…...

LangGraph 是什么:复杂 Agent 为何要从链升级到图

上一篇我们拆解了 Agent 的记忆系统——短期、长期到知识图谱,解决了"AI 记不住事"的问题。但当 Agent 任务复杂起来,你会遇到另一个更难的问题: 任务需要循环、需要分支、需要回退,而 LangChain 的 Chain 只能直线跑。…...