Mit6.006-lecture09-Breadth-First-Search

news2025/1/5 9:39:30

一、新单元:图

  • Quiz 1包含lecture01到lecture08,关注数据结构和排序

  • 今天开始新单元,lecture09-lecture14,关注图算法

二、图应用

  • 图无处不在

  • 任何网络系统都存在有向连接图

  • 比如:路网、计算机网络、社交网络

  • 任何离散系统的状态空间都可以用过渡图表示

  • 比如:puzzle & games like Chess, Tetris, Rubik’s cube

  • 比如:应用流,声明

三、图定义

  • G = ( V , E ) G=(V,E) G=(V,E)是一组点V和一组顶点的对 E ⊆ V × V E\subseteq V\times V EV×V

  • 有向边是有序对,比如, ( u , v ) , u , v ∈ V (u,v),u,v \in V (u,v)u,vV

  • 无向边是无序对,比如, { u , v } , u , v ∈ V \{u,v\},u,v\in V {u,v}u,vV,比如: ( u , v ) 和 ( v , u ) (u,v)和(v,u) (u,v)(v,u)

  • 在这个类中,我们假设所有图是简单的:

    • 边是去重的,比如(u,v)仅在E(尽管(v,u)可能出现)中出现一次,并且

    • 边是非重复点的组合,比如: u ≠ v , ( u , v ) ∈ E u\ne v,(u,v)\in E u=v(u,v)E

    • 简单暗示着: ∣ E ∣ = O ( ∣ V ∣ 2 ) |E|=\mathcal{O}(|V|^2) E=O(V2),因为无向: ∣ E ∣ = O ( ∣ V ∣ 2 ) |E|=\mathcal{O}(|V|^2) E=O(V2),有向: ∣ E ∣ = O ( 2 ∣ V ∣ 2 ) |E|=\mathcal{O}(2|V|^2) E=O(2∣V2)

四、相邻集合

  • u ∈ V , u 的出向相邻: A d j + ( u ) = { v ∈ V ∣ ( u , v ) ∈ E } u\in V,u的出向相邻:Adj^+(u)=\{v\in V|(u,v)\in E\} uVu的出向相邻:Adj+(u)={vV(u,v)E}

  • u ∈ V , u 的入向相邻: A d j − ( u ) = v ∈ V ∣ ( u , v ) ∈ E u\in V,u的入向相邻:Adj^-(u)={v\in V|(u,v)\in E} uVu的入向相邻:Adj(u)=vV(u,v)E

  • 顶点u的出度, u ∈ V , d e g + ( u ) = ∣ A d j + ( u ) ∣ u\in V,deg^+(u)=|Adj^+(u)| uVdeg+(u)=Adj+(u)

  • 顶点u的出度, u ∈ V , d e g − ( u ) = ∣ A d j − ( u ) ∣ u\in V,deg^-(u)=|Adj^-(u)| uVdeg(u)=Adj(u)

  • 对于无向图, A d j − ( u ) = A d j + ( u ) , d e g − ( u ) = d e g + ( u ) Adj^-(u)=Adj^+(u),deg^-(u)=deg^+(u) Adj(u)=Adj+(u)deg(u)=deg+(u)

  • 删除上标默认是出向,比如, A d j ( u ) = A d j + ( u ) , d e g ( u ) = d e g + ( u ) Adj(u)=Adj^+(u),deg(u)=deg^+(u) Adj(u)=Adj+(u)deg(u)=deg+(u)

五、图的表达

  • 为了存储图 G = ( V , E ) G=(V,E) G=(V,E),我们需要存储外向边 A d j ( u ) , u ∈ V Adj(u),u\in V Adj(u)uV

  • 首先,需要一个集合数据结构 A d j Adj Adj来映射u到 A d j ( u ) Adj(u) Adj(u)

  • 然后对于每个u,需要存储 A d j ( u ) Adj(u) Adj(u)到其他数据结构——邻接表

  • 通常对Adj使用直接访问数组或哈希表,因为想通过顶点快速查找

  • 通常对每个Adj(u)使用数组或链表,因为通常只需要迭代

  • 通用表达: A d j 尺寸为 Θ ( ∣ V ∣ ) ,每个 A d j ( u ) 尺寸为 Θ ( d e g ( u ) ) Adj尺寸为\Theta(|V|),每个Adj(u)尺寸为\Theta(deg(u)) Adj尺寸为Θ(V),每个Adj(u)尺寸为Θ(deg(u))

  • 因为由handshaking lemma得知 ∑ u ∈ V d e g ( u ) ≤ 2 ∣ E ∣ \sum_{u\in V}deg(u)\le2|E| uVdeg(u)2∣E,图存储空间为 Θ ( ∣ V ∣ + ∣ E ∣ ) \Theta(|V|+|E|) Θ(V+E)

  • 因此,对于图算法,线性时间意味着 Θ ( ∣ V ∣ + ∣ E ∣ ) \Theta(|V|+|E|) Θ(V+E),与图尺寸呈线性

六、举例

  • 例1和例2假设顶点标记为 { 0 , 1 , . . . , ∣ V ∣ − 1 } \{0,1,...,|V|-1\} {0,1,...,V1},因此可以对Adj使用直接访问数组,存储Adj(u)到数组。例3对Adj使用哈希表。

  • 注意在无向图中,连接是对称的,因为每个边算作两次出向

七、路径

  • 路径是点的序列 p = ( v 1 , v 2 , . . . , v k ) , ( v i , v i + 1 ) ∈ E , 1 ≤ i < k p=(v_1,v_2,...,v_k),(v_i,v_{i+1})\in E,1\le i\lt k p=(v1,v2,...,vk)(vi,vi+1)E1i<k

  • 如果没有重复点,路径是简单的

  • 长度 l ( p ) l(p) l(p)是路径p中边的个数

  • 距离 δ ( u , v ) , 从 u ∈ V 到 v ∈ V \delta(u,v),从u\in V到v \in V δ(u,v),uVvV,表示u到v之间所有路径长度的最小值,比如:从u到v之间最短路径的长度,(按照惯例, δ ( u , v ) = ∞ \delta(u,v)=\infty δ(u,v)=,如果u与v不相连)

八、图路径问题

  • 有许多你可能想解决的,与图路径有关的问题

  • SINGLE_PAIR_REACHABILITY(G, s, t):G中是否存在路径,从 s ∈ V 到 t ∈ V s\in V到t \in V sVtV

  • SINGLE_PAIR_SHORTEST_PATH(G, s, t):返回距离 δ ( s , t ) \delta(s,t) δ(s,t),以及 G = ( V , E ) G=(V,E) G=(V,E)中从 s ∈ V 到 t ∈ V s\in V到t \in V sVtV最短路径

  • SINGLE_PAIR_SHORTEST_PATHS(G,s):返回 δ ( s , v ) , v ∈ V \delta(s,v),v\in V δ(s,v)vV,以及一个最短路径树(包含从s到每个 v ∈ V v\in V vV的最短路径)

  • 上面的每个问题都至少和上面的每个问题一样难,解决完一个低级问题,可以把它当作黑盒来解决任意更高级的问题

  • 不会展示算法来解决所有这些问题

  • 而是,展示一个算法,耗时 O ( ∣ V ∣ + ∣ E ∣ ) \mathcal{O}(|V|+|E|) O(V+E)来解决最难的

九、最短路径树

  • 对于图中每个顶点,如何从源点s返回一条最短路径?

  • 一些路径有长度 Ω ( ∣ V ∣ ) \Omega(|V|) Ω(V),因此返回每条路需要 Ω ( ∣ V ∣ 2 ) \Omega(|V|^2) Ω(V2)

  • 对于所有 v ∈ V v\in V vV,存储它的parent P ( v ) P(v) P(v),从s出发最短路径上第二个到最后一个点

  • 让P(s)为null(从s到s,最短路径上没有第二个到最后一个点)

  • parent集合构成了最短路径树,尺寸为 O ( ∣ V ∣ ) \mathcal{O}(|V|) O(V)

    (例如,从每个点(s点可达)来返回到s的反向最短路径)

十、广度优先查找(BFS)

  • 如何计算 δ ( s , v ) \delta(s,v) δ(s,v) P ( v ) P(v) P(v) v ∈ V v\in V vV

  • 存储 δ ( s , v ) \delta(s,v) δ(s,v) P ( v ) P(v) P(v)到集合数据结构,对应点v距离和parent

  • 如果没有路径从s都v,不会存储v到P中,并设 δ ( s , v ) = ∞ \delta(s,v)=\infty δ(s,v)=

  • 按距离升序探索图中点

  • 目标:计算层级集合 L i = { v ∣ v ∈ V 且 d ( s , v ) = i } L_i=\{v|v\in V且d(s,v)=i\} Li={vvVd(s,v)=i},所有点位于距离i

  • 声明:每个点 v ∈ L i v\in L_i vLi,必须与点 u ∈ L i − 1 u\in L_{i-1} uLi1相邻(比如, v ∈ A d j ( u ) v\in Adj(u) vAdj(u)

  • 声明:在 L j L_j Lj(j<i)中的点,不会出现在 L i L_i Li

  • 不变性:对于 L j L_j Lj中所有点, δ ( s , v ) \delta(s,v) δ(s,v) P ( v ) P(v) P(v)已经正确计算过了

  • 基本情形(i=1): L 0 = { s } , δ ( s , s ) = 0 , P ( s ) = N o n e L_0=\{s\},\delta(s,s)=0,P(s)=None L0={s},δ(s,s)=0,P(s)=None

  • 推断步骤:计算 L i L_i Li

    - L i − 1 L_{i-1} Li1中每个顶点u

    -每个顶点 v ∈ A d j ( u ) v\in Adj(u) vAdj(u)(v没有出现在 L j L_j Lj中,j<i)

    -添加v到 L i L_i Li,设置 δ ( s , v ) = i , P ( v ) = u \delta(s,v)=i,P(v)=u δ(s,v)=iP(v)=u

  • 重复地计算 L j L_j Lj L i L_i Li(j<i),提升i直到 L i L_i Li是空集

  • 对于 v ∈ V v\in V vV δ ( s , v ) \delta(s,v) δ(s,v)没有被设置的点, δ ( s , v ) = ∞ \delta(s,v)=\infty δ(s,v)=

  • 通过推断,广度优先查找正确地计算所有 δ ( s , v ) \delta(s,v) δ(s,v) P ( v ) P(v) P(v)

  • 运行时间分析:

    • 存储每个 L i L_i Li到数据结构中,需要 Θ ( ∣ L i ∣ ) \Theta(|L_i|) Θ(Li)迭代, O ( 1 ) \mathcal{O}(1) O(1)插入(比如动态数组和链表)

    • 通过检查v是否在P中,来检查点v在不在 L j , j < i L_j,j<i Lj,j<i

    • 维护 δ \delta δ P P P在集合数据结构中,支持字典操作耗时 O ( 1 ) \mathcal{O}(1) O(1)(直接访问数组或哈希表)

    • 算法添加每个顶点u到level中,对每个 v ∈ A d j ( u ) v\in Adj(u) vAdj(u)花费 O ( 1 ) \mathcal{O}(1) O(1)

    • 由handshake lemma得知,工作上边界: O ( 1 ) × ∑ u ∈ V d e g ( u ) = O ( ∣ E ∣ ) \mathcal{O}(1)\times \sum_{u\in V}deg(u)=\mathcal{O}(|E|) O(1)×uVdeg(u)=O(E)

    • 最后,花费 Θ ( ∣ V ∣ ) \Theta(|V|) Θ(V),为s不可达顶点 v ∈ V v\in V vV,赋值 δ ( s , v ) \delta(s,v) δ(s,v)

    • 因此广度优先查找运行时间是线性的! O ( ∣ V ∣ + ∣ E ∣ ) \mathcal{O}(|V|+|E|) O(V+E)

  • 从例3图中点s出发,运行广度优先查找

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

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

相关文章

1146 Topological Order(31行代码+详细注释)

分数 25 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given directed graph? Now you are supposed to write a program to test …

Elasticsearch:在 Elastic 中访问机器学习模型

作者&#xff1a;Bernhard Suhm, Josh Devins Elastic 支持你需要的机器学习模型 Elastic 让你可以应用适合你的用例和 ML 专业水平的机器学习 (ML)。 你有多种选择&#xff1a; 利用内置的模型。 除了我们的可观察性和安全解决方案中针对特定安全威胁和系统问题类型的模型外…

Ubuntu crontab定时任务

1. crontab 相关的命令&#xff1a; 安装&#xff1a;apt-get install cron 启动&#xff1a;service cron start 重启&#xff1a;service cron restart 停止&#xff1a;service cron stop 检查状态&#xff1a;service cron status 查询cron可用的命令&#xff1a;service …

【算法排序】直接插入排序

目录 一、概念及其介绍二、过程图示三、复杂度以及稳定性四、代码实现 一、概念及其介绍 插入排序(InsertionSort)&#xff0c;一般也被称为直接插入排序。 对于少量元素的排序&#xff0c;它是一个有效的算法。插入排序是一种最简单的排序方法&#xff0c;它的基本思想是将一…

Keil(MDK-ARM)如何补充安装旧的编译器 AC5(ARM Compiler 5)

目录 一、前言二、下载1. 进入 Arm Developer 官网2. 下载 ARM Compiler 5 安装包3. 下载完成 三、安装1. 开始安装2. 安装过程3. 安装完成 四、配置1. 打开“Manage Project Items”2. 添加 ARM Compiler 5 编译器3. 添加成功4. 选择 ARM Compiler 5 作为当前使用的编译器 一、…

PHP+vue二手车交易信息网站系统

原来二手车网站由于二手车网站制度的不完善&#xff0c;许多城市的二手车网站市场都很少&#xff0c;而且欺诈行文较严重&#xff0c;肆意提高价格&#xff0c;隐瞒汽车所存在的故障问题&#xff0c;人们买卖二手车还是经过朋友帮忙介绍的途径来实现。这就导致了很多人的想卖车…

GitLab服务器搭建

文章目录 前述方式一&#xff1a;非容器安装搭建GitLab服务器查看gitlab用户的初始密码&#xff1a;修改初始密码gitlab配置文件修改服务的端口号启动并访问服务 方式二&#xff1a;容器下安装基于Docker安装Docker在容器中安装gitlab服务宿主机配置修改容器配置修改启动并访问…

SpringBoot如何优雅的实现参数验证

唠嗑部分 在我们设计接口时&#xff0c;参数验证是必不可少的一个环节&#xff0c;严格的参数验证能够保证数据的严谨&#xff0c;那么在SpringBoot项目中&#xff0c;你是如何验证参数的呢&#xff1f; 首先我们来描述一下需求 用户类&#xff0c;有用户名、用户头像、邮件…

基于html+css的图展示88

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

2000万的行数在2023年仍然是 MySQL 表的有效软限制吗?

谣言 互联网上有传言说我们应该避免在单个 MySQL 表中有超过 2000 万行。否则&#xff0c;表的性能会下降&#xff0c;当它超过软限制时&#xff0c;你会发现 SQL 查询比平时慢得多。这些判断是在多年前使用HDD硬盘存储时做出的。我想知道在2023年对于基于SSD的MySQL数据库来说…

【大数据学习篇10】Spark项目实战~网站转化率统计

学习目标/Target 掌握网站转化率统计实现思路 了解如何生成用户浏览网页数据 掌握如何创建Spark连接并读取数据集 掌握利用Spark SQL统计每个页面访问次数 掌握利用Spark SQL获取每个用户浏览网页的顺序 掌握利用Spark SQL合并同一用户浏览的网页 掌握利用Spark SQL统计每…

安卓基础巩固(三)多线程、数据存储、文件IO、SQLite

文章目录 多线程Handler相关概念UI线程/主线程MessageMessage QueueLooperHandler 使用步骤Handler.sendMessage&#xff08;&#xff09;Handler.post&#xff08;&#xff09; Handler 机制工作原理Handler内存泄露前置知识案例分析解决方案一&#xff1a;静态内部类弱引用解…

数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)

目录 题目描述 算法思路 伪代码 总体算法 BFS算法 伪代码解读 BFS算法 图解 题目描述 六度空间理论的核心观点是&#xff0c;人类社交网络中的任何两个人之间&#xff0c;平均只需要通过不超过六个中间人&#xff08;也就是六个社交关系&#xff09;就可以建立联系。换…

多台plc之间如何快速实现以太网无线连接?

常规来说&#xff0c;多台plc要实现以太网无线连接&#xff0c;首先要先确定以太网线必须正确连接&#xff0c;并建立物理连接。然后需要在PLC端设置好IP地址&#xff0c;以使不同PLC以相同协议可以实现通信交流。最后是建立PLC端数据采集及交换系统&#xff0c;要求在PLC端设置…

《封号码罗》关于js逆向猿人学第二题cookies里面m值的获取[纯扣算法](二十六)

这一题有点儿误打误撞的感觉。 本题使用了抓包工具Fiddler&#xff0c;m值在cookie里面&#xff0c;而且这个cookie是本地生成的 抓包发现有两次请求&#xff0c;第一次返回了一堆JS&#xff0c;而且cookie里面没有m值&#xff0c;第二次请求就带上了m值&#xff0c;所以m应该…

信号完整性分析基础知识之传输线和反射(七):带负载传输线、感性不连续引起的反射

带负载传输线 如果在传输线上有一个小的容性负载&#xff0c;信号会出现失真&#xff0c;上升时间也会降低。每个分立电容都会降低信号在其附近看到的阻抗。如果传输线上分布有多个容性负载&#xff08;例如一个总线上每隔1.2inch有一个2pF的连接器残桩&#xff0c;或者一个内…

单模光纤一维模场分布的MATLAB仿真

根据已知的单模光纤电场z分量分布&#xff0c;可以用MATLAB展示一维的模场分布 具体来说&#xff0c;通过数值计算解出给定光纤&#xff08;n_1&#xff0c;n_2&#xff0c;a&#xff09;参数时对应的V参量 通过特征方程解出V对应的W和U 通过这三个参数带入到光场的表达式中…

07. 算法之一致性哈希算法介绍

前言 哈希算法在程序开发中的很多地方都能看到他的身影&#xff0c;但是哈希有他的局限性&#xff0c;比如如果两个key哈希到同一个位置的时候&#xff0c;此时就不好处理。本节我们介绍一下常规处理方式。 1. 什么是哈希算法 哈希算法将任意长度的二进制值映射为较短的固定…

界面控件DevExtreme使用指南 - 如何自定义上下文菜单和工具栏

DevExtreme File Manager&#xff08;文件管理器&#xff09;小部件现在支持自定义内置的工具栏和上下文菜单&#xff0c;用户可以使用标准和定义的命令项填充项目集合&#xff0c;并配置设置来更改其外观和操作。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#x…

基于Keras-YOLO实现目标检测

Keras-YOLO 3项目使用Python语言实现了YOLO v3网络模型&#xff0c;并且可以导入Darknet网络预先训练好的权重文件信息直接使用网络进行目标识别。 1. 下载Keras-YOLO 3项目 执行如下命令下载Keras-YOLO 3项目代码&#xff1a; git clone https://github.com/qqwweee/keras-…