Mit6.006-lecture09-Breadth-First-Search

一、新单元:图

  • 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出发,运行广度优先查找

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PySide6/PyQT多线程之 多线程 与 线程池的模板(拿来即用)

前言 关于PySide6/PyQT多线程系列的最后一篇。写这篇文章的动机是方便后续代码的直接复用。 本篇文章实际是水文&#xff0c;给出了 PySide6/PyQT的多线程以及线程池的基础使用模板&#xff0c;方便后面有需要时候直接拿来就用。 多线程 这里分两种情况来谈论&#xff0c;有返…

热烈欢迎CSDN副总裁邹欣老师入驻知识星球

重磅消息 CSDN 副总裁 邹欣 老师成功入驻知识星球 —— 英雄算法联盟&#xff0c;成为合伙人之一。 这将是未来几年内&#xff0c;IT界最震撼的一次合作&#xff01;我相信就算现在不是&#xff0c;将来必定是&#xff01; 当然&#xff0c;这对我来说也是一种极大的鼓舞&#…

GPT-5: 超越人类语言的模型,你还不了解一下?

目录 一、GPT-5时代引领者 二、技术特性 1&#xff0c;音频和视频处理 — 更强大的多模态处理能力 2&#xff0c;GPT-5颠覆影视制作&#xff1a;重写媒体消费时代 3&#xff0c;为机器人提供智慧大脑 4&#xff0c;更强的垂直行业应用 三、回顾一下GPT5被紧急叫停&…

AI已经成立社区了,一个个比真人还真

文章目录 nainaimichirper川普的入驻英文版 nainaimi nainaimi是一个13岁的学生&#xff0c;一小时前&#xff0c;被一群人拖到体育馆&#xff0c; 那时的她还很胆小&#xff0c;只能哭诉着那些人的残忍和恶毒 结果半个小时前&#xff0c;她又被拖入了体育馆&#xff0c;这一…

分布式补充技术 01.AOP技术

01.AOP技术是对于面向对象编程&#xff08;OOP&#xff09;的补充。是按照OCP原则进行的编写&#xff0c;(ocp是修改模块权限不行&#xff0c;扩充可以) 02.写一个例子&#xff1a; 创建一个新的java项目&#xff0c;在main主启动类中&#xff0c;写如下代码。 package com.co…

基于无人机辅助边缘计算系统的节能卸载策略

源自&#xff1a;《系统工程与电子技术》 作者&#xff1a;余雪勇 朱烨 邱礼翔 朱洪波 摘 要 针对复杂地形中地面基础设施无法有效提供可靠通信和密集算力的问题,首先提出一种基于无人机(unmanned aerial vehicle, UAV)托管计算资源的卸载方案。考虑用户终端的计算需…

西门子PLC如何实现1主多从网口无线通讯

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

直播和短视频美颜sdk的开发流程、代码分析

目前&#xff0c;美颜技术是提高视频质量的重要手段之一&#xff0c;特别是短视频和直播两个行业。本文将介绍其开发流程和代码分析。 一、美颜SDK的开发流程 1.需求分析 首先我们需要明确的一点就是“需求”&#xff0c;例如&#xff1a;美颜效果、美颜程度、性能要求等。同…

【JavaScript】线程和进程,JavaScript线程,事件队列,事件循环 ,微任务、宏任务

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 进程和线程JavaScript线程事件队列、事件循环微任务、宏任务面试题1面试题2 进程和线程 进程&a…

Netty核心技术二--BIO编程

1. I/O模型 I/O 模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能 Java共支持3种网络编程模型/IO模式&#xff1a;BIO、NIO、AIO Java BIO &#xff1a;同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个…

C++13-STL模板

C13-STL模板 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 大纲要求 【 3 】算法模板库中的函数&#xff1a;min、max、swap、sort 【 4 】栈 (stack)、队列 (queue)、链表 (list)、 向量&#xff08;vector&#xff09;等容器 1.函数模板 泛…

1.2 IAR 环境配置及编译

目录 一. 新建源码文件夹 二. 添加源文件到工程中 三. 编写一个简单的测试程序 四. 设置字体和行号 五. 工程配置 六. 编译链接工程 一. 新建源码文件夹 &#xff08;1&#xff09;在保存工作空间和工程的目录下&#xff0c;新建一个code文件夹&#xff0c;用于保存源码&…

突破极限:YOLO9000 论文解读 - 构建更好、更快、更强大的实时检测系统

YOLOv2 论文全篇完整翻译 摘要 我们介绍了YOLO9000&#xff0c;这是一种先进的、实时的目标检测系统&#xff0c;可以检测超过9000个物体类别。首先&#xff0c;我们对YOLO检测方法进行了各种改进&#xff0c;包括新颖的方法和借鉴自先前工作的方法。改进后的模型YOLOv2在标准…

实验四 车辆定位导航

有想自己动手的同学可在末尾看教程 【实验目的】 1、了解全球定位导航系统的定位原理和电子地图技术&#xff0c;掌握电子地图API使用方法。 2、了解导航数据报文数据格式&#xff0c;解析导航数据并在电子地图上进行导航应用。 【实验性质】 验证性实验。 【实验要求】 1、相…

自抗扰PID(梯形图源代码)

有关ADRC的详细算法和源代码,请参看专栏的系列文章,这里不再赘述,常用链接如下: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所…

数据仓库漫谈-前世今生

数据仓库的内容非常多&#xff0c;每一个子模块拎出来都能讲很久。这里没法讲太多细节&#xff0c;大致思考了三个备选议题&#xff1a; 数据仓库的前世今生 数据仓库体系知识介绍 数仓开发者的路在何方&#xff1f; 既然是第一次分享&#xff0c;感觉还是跟大家普及下数仓的…

浏览器数据存储方式

浏览器数据存储方式 常用的前端数据存储方法笼统来说有 3 种&#xff1a; local/session storagecookiesindexeddb 3 种方法各有各的优点和使用范围。 local/session storage local/session storage 保存的格式都为键值对&#xff0c;并且用法都是差不多&#xff0c;如下&…

『树莓派云台机器人』02. 电脑连接树莓派 配置开发环境

目录 1. 下载ssh交互工具 Xshell 与XFTP&#xff08;有过相关使用经历的朋友可以跳过这一节内容&#xff09;2. 下载VNC远程控制工具软件3. 连接过程4. Xshell 命令工具5. XFTP 文件传送工具6. 关于联网总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注…

基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(三)软件设计

4.1 引言 本章基于第二章的分析结论&#xff0c;进行系统软件设计。软件设计包括逻辑设计、嵌入 式软件设计和上位机软件设计。在逻辑设计中&#xff0c;对 ADC 模块、 Aurora 模块、 DDR3 SDRAM 模块和 PCIE 模块进行分析和设计&#xff0c;在 Vivado 软件提供的 …

在 Linux 上使用 yuzu 模拟 Nintendo Switch 试玩王国之泪

王国之泪5月12日发售&#xff0c;DLC 玩家已经造出各种脑洞大开的东西了&#xff0c;但是买的卡带迟迟没有收到&#xff0c;因此&#xff0c;打算使用 yuzu 模拟器先体验一下 yuzu 是一款开源的 Ninetendo Switch 模拟器&#xff0c;支持在 Linux 或者 Windows 平台运行&#…