【Python 数据结构 14.邻接表】

希望你的眼睛可以一直笑,想要的都得到

                                                        —— 25.3.11

一、邻接表的概念

1.邻接表的定义

        邻接表是一种表示图的数据结构。邻接表的主要概念是:对于图中的每个顶点维护一个由与其相邻的顶点组成的列表。这个列表可以用数组、链表或其他数据结构来实现。

        实际上,邻接表可以用于有向图、无向图、带权图、无权图。这里只考虑无权图的情况,带权图只需要多存储一个边权的数据就可以了


2.邻接表的顺序表结构

        可以用二维列表模拟实现

adjSize[maxn]:adjSize[i] 代表从 i 出发,能够直接到达的点的数量

adj[maxn][maxn]:adjSize[i][j] 代表从 i 出发,能够到达的第 j 个顶点

在一个 n 个顶点的图上,由于任何一个顶点最多都有 n - 1 个顶点相连,所以 maxn = n - 1 


3.邻接表的链表存储

        用链表来实现邻接表,实际上就是对于每一个顶点,它能够到达的顶点,都被存储在以它为头结点的链表上

对于上述的图,存储的是四个链表:

        ① 0 —> 3 —> 2 —> NULL

        ② 1 —> 0

        ③ 2 —> NULL

        ④ 3 —> 1          

这就是用链表表示的邻接表。注意:这里实际上每个链表的头结点是存储在一个顺序表中的,所以严格意义上来说是 顺序表 +链表 的实现。


4.邻接表的应用

        邻接表一般应用在图的遍历算法,比如:深度优先搜索、广度优先搜索。更加具体的,应用在最短路上,比如 Dijkstra、Bellman-Ford、SPFA;以及最小生成树,比如 Kruskal、Prim;还有拓扑排序、强连通分量、网络流、二分图最大匹配 等等问题。


5.邻接表的优点

        邻接表表示法的优点主要有:空间效率、遍历效率

        空间利用率高:邻接表通常比邻接矩阵更节省空间,尤其是对于稀疏图。因为邻接表仅需要存储实际存在的边,而邻接矩阵需要存储所有的边。

        遍历速度:邻接表表示法在遍历与某个顶点相邻的所有顶点时,时间复杂度与顶点的度成正比。对于稀疏图,这比邻接矩阵表示法的时间复杂度要低。


6.邻接表的缺点

        不适合存储稠密图:对于稠密图(即图中边的数量接近于n ^ 2),导致每个顶点的边列表过长,从而降低存储和访问效率

        代码复杂:相比于邻接矩阵,实现代码会更加复杂


二、Python中的邻接表

EdgeNode:边结点,表示邻接表中的一条边,每个边结点记录目标顶点和权重,类似于链表中的结点结构

        v:边指向的顶点编号(弧尾结点)

        w:边的权重值,用于带权图的场景

VertexNode:顶点结点,管理该顶点的所有出边,每个顶点维护一个边列表edges,存储从该顶点出发的所有边,形成链式结构

        v:当前顶点的唯一标识符(通常为整数索引)

Graph:图结构,创建 n 个顶点结点VertexNode对象,构成邻接表的基础结构

        n:图的顶点数量

addEdge:添加边,在顶点u的邻接边列表中追加新的EdgeNode,完成边的添加

        u:边的起始顶点编号(弧头顶点)

        v:边的目标顶点编号(弧尾顶点)

        w:边的权重值

printGraph:打印邻接表,遍历每个顶点的邻接边列表,输出其连接的顶点及权重

# 弧尾结点
class EdgeNode:def __init__(self, v, w):# 边结点的弧尾self.vertex = v# 边结点的权重self.weight = w# 弧头结点
class VertexNode:def __init__(self, v):# 弧头结点self.vertex = v# 一个边结点EdgeNode的列表self.edges = []class Graph:def __init__(self, n):# n 个结点self.n = n# 每个结点都有一个弧头节点VertexNodeself.nodes = [VertexNode(i) for i in range(n)]# 结点u 到 结点v 权重w的边def addEdge(self, u, v, w):self.nodes[u].edges.append(EdgeNode(v, w))def printGraph(self):for i in range(self.n):print("Vertex", i, end=":")for edge in self.nodes[i].edges:print(edge.vertex, "(", edge.weight, ")", end=" ")print()def Text():graph = Graph(5)graph.addEdge(0, 1, 1)graph.addEdge(0, 2, 2)graph.addEdge(1, 2, 3)graph.addEdge(1, 3, 4)graph.addEdge(2, 3, 5)graph.addEdge(2, 4, 6)graph.addEdge(3, 4, 7)graph.printGraph()Text()

代码运行结果:

结点0 到 结点1 有一条边

结点0 到 结点2 有两条边

结点1 到 结点2 有三条边

结点1 到 结点3 有四条边

结点2 到 结点3 有五条边

结点2 到 结点4 有六条边

结点3 到 结点4 有七条边

结点4 没有出边


三、邻接表和邻接矩阵的对比

        邻接矩阵是一个 n × n 的矩阵,矩阵的值为由 横坐标 i 点出发到 j 点这条路径的权值,n 是图中的结点数量

        为每个顶点维护一个邻接边列表,高效地存储图的连接关系

对比维度邻接表邻接矩阵支持来源
空间复杂度O(V+E),适合稀疏图(边数远小于顶点数平方)O(V²),适合稠密图(边数接近顶点数平方)

1

2

5

边的查找效率O(degree(V)),需遍历链表O(1),直接访问矩阵元素

1

2

4

遍历邻居效率O(degree(V)),仅遍历实际存在的邻接边O(V),需扫描整行/列(即使无邻接边)

2

4

6

添加边操作O(1)(头插法)O(1)(直接修改矩阵值)

1

2

5

删除边操作O(degree(V)),需遍历链表定位O(1)(直接修改矩阵值)

2

5

6

存储方式顶点数组 + 链表/动态数组(记录邻接顶点)二维数组(元素表示边存在性/权重)

1

5

6

适用场景社交网络、网页链接、稀疏图、动态图(顶点/边频繁变化)稠密图、带权图、需要频繁判断边存在的场景(如路径规划)

2

5

7

特殊场景支持可存储重复边和多重边只能表示单一边(无重复边)

8

10

无向图处理每条边存储两次(双向链表)矩阵对称,仅需存储一次

3

4

10

实现复杂度较高(需维护链表或动态数组)简单(固定大小二维数组)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01 音视频知识学习(视频)

图像基础概念 ◼像素:像素是一个图片的基本单位,pix是英语单词picture的简写,加上英 语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素” 之意。 ◼ 分辨率:是指图像…

git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)

问题描述: 今天发现gitea仓库推送到某个镜像仓库的操作几个月前已经报错终止推送了,报错如下: 首先翻译报错提示可知是因为git仓库大小超过1G限制。检查本地.git文件,发现.git文件大小已达到1.13G。确定是.git文件过大导致&…

clickhouse集群部署保姆级教程

ClickHouse安装 版本要求 23.8及之后的版本 硬件要求 三台机器 建议配置 磁盘 ssd 500G内存 32gcpu 16c 最低配置 磁盘 机械硬盘 50G内存 4gcpu 4c 容量规划 一亿条数据大约使用1TB磁盘容量 参考官方容量推荐 安装包准备 zookeeper安装 zookeeper需要java启动&…

FANformer:融合傅里叶分析网络的大语言模型基础架构

近期大语言模型(LLM)的基准测试结果引发了对现有架构扩展性的思考。尽管OpenAI推出的GPT-4.5被定位为其最强大的聊天模型,但在多项关键基准测试上的表现却不及某些规模较小的模型。DeepSeek-V3在AIME 2024评测中达到了39.2%的Pass1准确率,在SWE-bench Ve…

Electron使用WebAssembly实现CRC-32 常用标准校验

Electron使用WebAssembly实现CRC-32 常用标准校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 常用标准格式校验的方式。 CRC-32 常用标准校验函数WebAssembly源文件…

MySQL数据库的相关语句

数据库的操作(CURD) 创建数据库(重点) 查看数据库(重点) show databases; ‐‐ 查看所有的数据库use 数据库名称;(*****) ‐‐ 使用数据库show create database 数据库名称; ‐‐ 查询数据库的创建的信息s…

Git的命令学习——适用小白版

浅要了解一下Git是什么: Git是目前世界上最先进的的分布式控制系统。Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数据。实际上…

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发,采用模块化设计,支持单机部署与集群部署,能够根据业务需求动态扩展。系统前端使用uniapp框架,可…

Unity光照之Halo组件

简介 Halo 组件 是一种用于在游戏中创建光晕效果的工具,主要用于模拟光源周围的发光区域(如太阳、灯泡等)或物体表面的光线反射扩散效果。 核心功能 1.光晕生成 Halo 组件会在光源或物体的周围生成一个圆形光晕,模拟光线在空气…

【cocos creator】热更新

一、介绍 试了官方的热更新功能,总结一下 主要用于安卓包热更新 参考: Cocos Creator 2.2.2 热更新简易教程 基于cocos creator2.4.x的热更笔记 二、使用软件 1、cocos creator v2.4.10 2、creator热更新插件:热更新manifest生成工具&…

深度评测阿里云操作系统控制台:功能全面,体验卓越!

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 阿里云操作系统控制台 操作系统控制台操作系统实践体验服务的开通创建ESC实例组件管理功能体验:节点健康系统诊断系统观测订阅管…

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录 前言1. 问题分析2. 时间戳(推荐,可尝试)3. 使用 JsonDeserialize & JsonSerialize(中立)4. 前端传 ISO-8601 格式(不推荐,可尝试)5. 用 String(中立&#xff09…

【vitepress】如何搭建并部署自己的博客网站

文章目录 新的改变旧的github.io地址,现在不用更新netlify托管之后为这个 一 如何搭建[1]:安装vitepress初始化Vitepress启动项目 二 如何部署[2]视频教程 [3] 新的改变 旧的github.io地址,现在不用 https://dl-hx.github.io/myBlog/ 更新netlify托管之后为这个 https://dl…

Cursor新版0.47.x发布

0.47.x - 可靠性、键盘快捷键与提前体验选项功能 本次更新主要聚焦于稳定性和性能改进,以确保现有功能更好地运行。 新功能与改进 键盘快捷键:所有键盘快捷键现在都可以在键盘快捷键菜单中找到。前往 设置 > 键盘快捷键 来修改或添加新的快捷键。 …

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有,先停止docker systemctl stop docker如果是yum安装,卸载方式为 #已防版本冲突,直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…

XGBoost介绍

XGBoost:是eXtreme Gradient Boosting(极端梯度提升)的缩写,是一种强大的集成学习(ensemble learning)算法,旨在提高效率、速度和高性能。XGBoost是梯度提升(Gradient Boosting)的优化实现。集成学习将多个弱模型组合起来,形成一个…

Aliyun CTF 2025 web ezoj

文章目录 ezoj ezoj 进来一看是算法题,先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥,根据页面底部提示去/source看到源代码,没啥思路,直接看wp吧,跟算法题没啥关系,关键是去看源码 def audit_checker(even…

大数据hadoop课程笔记

1.课程导入 柯洁 Alpha Go是人工智能领域的里程碑。 深度学习 大模型deepseek chatgpt 大模型 和 大数据 之间有着非常紧密的关系。可以说,大数据是大模型发展的基石,而大模型是大数据价值挖掘的重要工具。 https://youtu.be/nN-VacxHUH8?sifj7Ltk…

Pandas数据清洗实战之清洗猫眼电影

本次案例所需要用到的模块 pandas(文件读取保存 操作表格的模块) 将上次Scrapy爬取下来的文件 做个数据清洗 变成我们想要的数据 确定目的:将此文件中的duration字段中的分钟 和publisher_time上映去掉 只保留纯数值 数据清洗题目如下: 修复 publish_time列中的错…

UDP-网络编程/socket编程

一,socket相关接口 1,socket 我们来介绍socket编程的第一个接口:socket,它需要用到的头文件如图: 其中domain表示域或者协议家族: 本次我就用AF_INET(ipv4)来做演示 type参数表示…