图——表示与遍历

news2025/3/17 12:04:20
图的两种主要表示方法

图有两种常用的表示方法,一种是邻接表法(adjacency-list),另一种是邻接矩阵法(adjacency-matrix)。

邻接表法储存数据更紧凑,适合稀疏的图(sparse graphs

邻接矩阵法适合密集的图(dense graphs)

下图来自 CLRS,很好的展示两种不同的表示方法。

 

在邻接法表示中,一个图 G=(V,E) 由含有 |V| 个链表头的数组 Adj 构成。每个链表包括相对应的顶点能直接到达的所有顶点。无向图的邻接表所有链表的长度和为 2|E|,即边的个数的 2 倍,有向图的邻接表的所有链表长度和为 |E|。无论有向图还是无向图,邻接表法的空间复杂度都为 Θ(V+E)。

邻接表的缺点是,它无法快速给出两个顶点间是否有直接相连的边。

邻接矩阵法使用一个 |V|×|V| 的矩阵表示图,如果两个顶点间有边,那么相对应的 G[u][v] 值为 1(或者权重) ,否则为 0 。观察无向图的邻接矩阵,矩阵以主对角线为轴对称,因此我们几乎可以将无向图的邻接矩阵空间占用减半。无论有向图还是无向图,邻接矩阵法的空间复杂度都是 Θ(V^2) ,与边的个数无关

邻接表与邻接矩阵两种方法,可以清晰的体现,时间换空间,空间换时间,这种“计算守恒定律”(这句话是我自己编的)。

广度优先搜索 (又称宽度优先搜索,Breadth-First Fearch, BFS)

给定图 G = (V, E), 以及一个顶点 s,BFS会搜索所有可达的顶点,计算从初始 s 到目标顶点 t 的距离(距离指经过的边的数量)。BFS 还会生成一个广度优先树,以 s 为根,包括所有的可达顶点。对于图中的两个顶点 s 以及 t ,最短的路径就是以 s 为根的广度优先树中,根 s 到 t 的路径。

BFS 之所以叫 BFS,就是因为它“均匀” 的发现所有顶点,在距离初始顶点 s k + 1 距离的顶点被发现前,所有距离为 k 的顶点都已经被发现。BFS 在发现顶点时,使用颜色来标记,初始时所有的顶点都为白色,当一个顶点被发现时,它被标记为灰色(或者黑色),如果一个顶点是黑色,那么它周围直接连接的所有顶点,只能灰色或者黑色,而灰色顶点周围可以有白色顶点。

BFS 构建一个广度优先树,初始顶点为根。扫描已发现顶点 u 的邻接表,每当发现(第一次遇见)一个白色顶点 v 的时候,将顶点 v 以及边 (u, v) 加入到树,称顶点 u 为顶点 v 的在树中的前序顶点(predecessor)或者父顶点(parent)。因为一个顶点只能被发现一次,一个顶点最多有一个父顶点。在广度搜索树中,祖先顶点与孙子顶点是相对初始顶点 s 来说的。

BFS使用队列(Queue)实现,以下的代码来自 CLRS,图用邻接表来表示时,BFS 的时间复杂度是 O(V+E)

 下面是 BFS 的例子,同样来自 CLRS。

BFS 可以查找两顶点间的最短距离。

深度优先搜索 (Depth-First Search, DFS)

深度优先搜索首先向更深处搜索首先搜索最近发现的,还有未发现的边的顶点。一旦某个顶点的所有边都搜索完毕,就回溯,直到所有的可达的顶点都被搜索到。如果依旧有未发现的顶点,DFS 选取一个未搜索顶点作为新的初始顶点,继续搜索,直到所有的顶点都被搜索。

对比广度优先与深度优先,你可能会发现(认为),BFS 只能搜索某个初始顶点的所有可达顶点而 DFS 搜素所有顶点。其实并不是这样,BFS 也可以选取其他初始顶点继续搜索,但是我们一般不这样做。BFS 通常用来寻找最短路径,而 DFS 通常作为遍历图的一种方法。两者应用场景不同。

因为 DFS 默认搜索所有的顶点,最后我们可能会得到一片深度搜索树森林。与广度优先一样,未发现的顶点为白色,正在探索的顶点为灰色,完全探索的顶点为黑色。深度优先搜索对每个被搜索的顶点 v,会记录两个时间,一个是搜索这个顶点的开始时间 v.d,另一个是搜索完毕当前顶点的时间 v.f,当 t<v.d 时,顶点为白色,当 v.d<t<v.f 时,顶点为灰色,当 v.f<t 时,顶点为黑色。

下面是 CLRS 中 DFS 的伪代码。

CLRS 中 DFS 过程例子。

 图用邻接表来表示时,DFS 的时间复杂度是 Θ(V+E)

 

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

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

相关文章

新手村:数据预处理-异常值检测方法

机器学习中异常值检测方法 一、前置条件 知识领域要求编程基础Python基础&#xff08;变量、循环、函数&#xff09;、Jupyter Notebook或PyCharm使用。统计学基础理解均值、中位数、标准差、四分位数、正态分布、Z-score等概念。机器学习基础熟悉监督/无监督学习、分类、聚类…

ChatGPT-4

第一章&#xff1a;ChatGPT-4的技术背景与核心架构 1.1 生成式AI的发展脉络 生成式人工智能&#xff08;Generative AI&#xff09;的演进历程可追溯至20世纪50年代的早期自然语言处理研究。从基于规则的ELIZA系统到统计语言模型&#xff0c;再到深度学习的革命性突破&#x…

C语言_数据结构总结9:树的基础知识介绍

1. 树的基本术语 - 祖先&#xff1a;考虑结点K&#xff0c;从根A到结点K的唯一路径上的所有其它结点&#xff0c;称为结点K的祖先。 - 子孙&#xff1a;结点B是结点K的祖先&#xff0c;结点K是B的子孙。结点B的子孙包括&#xff1a;E,F,K,L。 - 双亲&#xff1a;路径上…

Python学习第十八天

Django模型 定义&#xff1a;模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表&#xff0c;类的属性对应表的字段。 作用&#xff1a;通过模型&#xff0c;Django 可以将 Python 代码与数据库表结构关联起来&#xff0c;开发者无需直接编写 S…

蓝桥杯备考:图论之Prim算法

嗯。通过我们前面的学习&#xff0c;我们知道了&#xff0c;一个具有n个顶点的连通图&#xff0c;它的生成树包括n-1个边&#xff0c;如果边多一条就会变成图&#xff0c;少一条就不连通了 接下来我们来学一下把图变成生成树的一个算法 Prim算法&#xff0c;我们从任意一个结…

langchain框架

LangChain的架构分为多个层次&#xff0c;支持Python和JavaScript生态 基础层&#xff08;langchain-core&#xff09;&#xff1a;提供LLM抽象接口、表达式语言&#xff08;LCEL&#xff09;等核心机制&#xff0c;支持超过70种主流模型&#xff08;如GPT-4、Llama&#xff0…

RHCE(RHCSA复习:npm、dnf、源码安装实验)

七、软件管理 7.1 rpm 安装 7.1.1 挂载 [rootlocalhost ~]# ll /mnt total 0 drwxr-xr-x. 2 root root 6 Oct 27 21:32 hgfs[rootlocalhost ~]# mount /dev/sr0 /mnt #挂载 mount: /mnt: WARNING: source write-protected, mounted read-only. [rootlocalhost ~]# [rootlo…

Mybatis3 调用存储过程

1. 数据库MySQL&#xff0c;user表 CREATE TABLE user (USER_ID int NOT NULL AUTO_INCREMENT,USER_NAME varchar(100) NOT NULL COMMENT 用户姓名,AGE int NOT NULL COMMENT 年龄,CREATED_TIME datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,CREATED_BY varchar(100) NOT NUL…

HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型

一、软件介绍 文末提供程序和源码下载 HiPixel是一个开源程序基于SwiftUI构建的macOS原生应用程序&#xff0c;用于AI驱动的图像超分辨率&#xff0c;并利用Upscayl的强大AI模型。 二、软件特征 具有 SwiftUI 界面的原生 macOS 应用程序使用 AI 模型进行高质量图像放大通过 G…

缓存和客户端数据存储体系(Ark Data Kit)--- 应用数据持久化(首选项持久化、K-V、关系型数据库)持续更新中...

Core File Kit做怎删改查操作不便&#xff0c;用Ark Data Kit。 功能介绍 ArkData &#xff08;方舟数据管理&#xff09;为开发者提供数据存储、数据管理和数据同步能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠以及共享访问等管…

本地部署OpenManus及原理介绍

概述&#xff1a; 最近Minaus特别火&#xff0c;随后开源社区就有项目尝试复刻Minaus&#xff0c;项目名称为OpenManus&#xff0c;原理是用推理模型为决策者&#xff0c;将我们输入的问题进行分解后调用本地工具执行。 OpenManus安装&#xff1a; 本人在Ubuntu桌面版本上安装…

高效手机检测:视觉分析技术的优势

在当今社会&#xff0c;手机已成为人们日常生活和工作中不可或缺的工具。然而&#xff0c;在某些特定场合&#xff0c;如考场、工作场所等&#xff0c;手机的使用却可能带来负面影响。因此&#xff0c;如何有效监测和防止在这些场合偷用手机的行为&#xff0c;成为了一个亟待解…

Spring Boot配置类原理、Spring Boot核心机制理解,以及实现自动装置的底层原理

目的:从底层源码角度分析 Spring Boot 配置类以及自动装载的底层原理 文章目录 1. Spring Boot 配置类实现自动装载1.1 @Configuration注解1.2 @Configuration 注解完成 bean 注入流程图1.3 @ConfigurationProperties注解赋值2. Spring Boot的核心机制:自动装配2.1 @SpringBo…

01-Canvas-使用fabric初始

fabric官网&#xff1a; https://fabric5.fabricjs.com/demos/ 创建画布并绘制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

树莓派 连接 PlutoSDR 教程

在树莓派5上安装PlutoSDR&#xff08;ADALM-Pluto&#xff09;的驱动程序&#xff0c;主要需要安装相关的库和工具&#xff0c;以便与PlutoSDR通信&#xff0c;比如libiio和libad9361&#xff0c;并确保系统能够识别设备。由于树莓派5运行的是基于Linux的系统&#xff08;通常是…

Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境

在日常的开发过程中&#xff0c;使用版本控制工具 Git 是一个非常重要的技能&#xff0c;特别是对于管理和协作开发。通过 GitHub&#xff0c;我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后&#xff0c;终于找到的解决的方案&#xff0c;遂将该方法简要的记录下来&#xff0c;以备后用&#xff0c;并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下&#xff0c;假…

零基础keil:设置注释快捷键

1.打开快捷键设置&#xff1a; 在Keil中&#xff0c;选择菜单栏中的“Settings”&#xff0c;然后选择“Shortcuts”来打开快捷键设置界面。 2.选择注释命令&#xff1a; 在快捷键设置界面中&#xff0c;找到与注释相关的命令&#xff0c;如“Comment Selection”&#xff0…

Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别

文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用&#xff1a;避免空指针异常2.3 为什么要用&#xff1f;2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明&#xff1a; orElse 如何使用orElseGet 如何使用两者的…

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手&#xff08;Three-way Handshake&#xff09;与四次挥手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次挥手&#xff08;Four-way Wave&#xff09;三、常见问题解答总结为什么三次握手不…