【数据结构(邓俊辉)学习笔记】图07——最短路径

文章目录

  • 0. 概述
  • 1. 问题
  • 2. 最短路径
    • 2.1 最短路径树
      • 2.1.1 单调性
      • 2.1.2 歧义性
      • 2.1. 3 无环性
    • 2.2 Dijkstra 算法
      • 2.2.1 贪心迭代
      • 2.2.2 实现
      • 2.2.3 实例
      • 2.2.4 复杂度

0. 概述

学习下最短路径和Dijistra算法

1. 问题

在这里插入图片描述
给定带权网络G = (V, E),以及源点(source)s ∈ V,对于所有的其它顶点v,s到v的最短通路有多长?该通路由哪些边构成?

2. 最短路径

2.1 最短路径树

2.1.1 单调性

在这里插入图片描述
设顶点s到v的最短路径为 ρ \rho ρ。于是对于该路径上的任一顶点u,若其在 ρ \rho ρ上对应的前缀为 σ \sigma σ,则 σ \sigma σ也必
是s到u的最短路径(之一)。

2.1.2 歧义性

较之最小支撑树,最短路径的歧义性更难处理。首先,即便各边权重互异,从s到v的最短路径也未必唯一。另外,当存在非正权重的边,并导致某个环路的总权值非正时,最短路径甚至无从定义。因此以下不妨假定,带权网络G内各边权重均大于零。

2.1. 3 无环性

在这里插入图片描述考查从源点到其余顶点的最短路径(若有多条,任选其一)。于是由以上单调性,这些路径的并集必然不含任何(有向)回路。这就意味着,如图所示,构成所谓的最短路径树(shortest-path tree)。

2.2 Dijkstra 算法

2.2.1 贪心迭代

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上述思路可知,只要能够确定 u k + 1 u_{k+1} uk+1,便可反过来将 T k T_k Tk扩展为 T k + 1 T_{k+1} Tk+1。如此,便可按照到s距离的非降次序,逐一确定各个顶点{ u 1 u_1 u1, u 2 u_2 u2, …, u n u_n un},同时得到各棵最短路径子树,并得到最终的最短路径树T = T n T_n Tn。现在,问题的关键就在于:
~~~~~~~~~~~~~~~~~~                   如何才能高效地找到 u k + 1 u_{k+1} uk+1
实际上,由最短路径子树序列的上述性质,每一个顶点 u k + 1 u_{k+1} uk+1都是在 T k T_k Tk之外,距离s最近者。若将此距离作为各顶点的优先级数,则与最小支撑树的Prim算法类似,每次将 u k + 1 u_{k+1} uk+1加入 T k T_k Tk并将其拓展至 T k + 1 T_{k+1} Tk+1后,需要且只需要更新那些仍在 T k + 1 T_{k+1} Tk+1之外,且与 T k + 1 T_{k+1} Tk+1关联的顶点的优先级数。

可见,该算法与Prim算法仅有一处差异:考虑的是 u k + 1 u_{k+1} uk+1到s的距离,而不再是其到 T k T_k Tk的距离。

2.2.2 实现

与Prim算法一样,Dijkstra算法也可纳入此前的优先级搜索算法框架。

在这里插入图片描述

为此,每次由 T k T_k Tk扩展至 T k + 1 T_{k+1} Tk+1时,可将 V k V_k Vk之外各顶点u到 V k V_k Vk的距离看作u的优先级数(若u与 V k V_k Vk内顶点均无联边,则优先级数设为+∞)。如此,每一最短跨越边 e k e_k ek所对应的顶点 u k u_k uk,都会因拥有最小的优先级数(或等价地,最高的优先级)而被选中。

在这里插入图片描述
唯一需要专门处理的是,在 u k u_k uk e k e_k ek加入 T k T_k Tk之后,应如何快速地更新 V k + 1 V_{k+1} Vk+1以外顶点的优先级数。实际上,只有与 u k u_k uk邻接的那些顶点,才有可能在此后降低优先级数。因此与Prim算法一样,也可遍历 u k u_k uk的每一个邻居v,只要边 u k v u_kv ukv的权重加上 u k u_k uk的优先级数,小于v当前的优先级数,即可将后者更新为前者。

2.2.3 实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.4 复杂度

不难看出,以上顶点优先级更新器只需常数运行时间。同样根据对PFS搜索性能的分析结论,Dijkstra算法这一实现版本的时间复杂度为O( n 2 n^2 n2)。

作为PFS搜索的特例,Dijkstra算法的效率也可借助优先级队列进一步提高。

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

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

相关文章

4.大模型微调技术LoRA

大模型低秩适配(LoRA)技术 现有PEFT 方法的局限与挑战 Adapter方法,通过增加模型深度而额外增加了模型推理延时。Prompt Tuning、Prefix Tuning、P-Tuning等方法中的提示较难训练,同时缩短了模型可用的序列长度。往往难以同时实现高效率和高质量,效果通常不及完全微调(f…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及电力不平衡风险的配电网分区协同规划》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

探究IOC容器刷新环节初始化前的预处理

目录 一、IOC容器的刷新环节快速回顾 二、初始化前的预处理prepareRefresh源码分析 三、初始化属性源 (一)GenericWebApplicationContext初始化属性源 (二)StaticWebApplicationContext初始化属性源 四、初始化早期事件集合…

3.大模型高效微调PEFT

大模型高效微调(PEFT)技术 预训练模型的背景 预训练与微调:传统的微调方法通常涉及对整个预训练模型的参数进行再训练,以适应特定任务。这虽然有效,但计算成本高,且需要大量的标记数据。模型结构:像BERT或GPT这样的模型通常包含数亿甚至数十亿个参数,构成一个深层次的…

Qt——升级系列(Level Four):控件概述、QWidget 核心属性、按钮类控件

目录 控件概述 QWidget 核心属性 核心属性概览 enabled geometry windowTitle windowIcon windowOpacity cursor font toolTip focusPolicy styleSheet 按钮类控件 Push Button Radio Buttion Check Box Tool Button 控件概述 Widget 是 Qt 中的核⼼概念. 英⽂原义是 "…

西门子学习笔记11 - PTO脉冲指令的使用

1、使用指令前的设置 1、打开一个脉冲发生器,并启用 2、选择使用PTO(脉冲A和方向B) 3、硬件设置输出 4、这样前期的准备工作就完成了 2、指令的使用 1、添加指令CTRL_PTO 2、配置如下 3、方向控制程序如下 4、最后进行测试即可

C语言之存储类、作用域、生命周期、链接属性

一 :概念解析 1: 存储类 (1)存储类就是存储类型,就是描述C语言变量存储在什么地方 (2)内存有多种管理方法:栈、堆数据段、bss段、.text段......一个变量的存储类属性就是描述…

html--万年历

<!DOCTYPE html> <html lang"zh_CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><meta charset"utf-8" /><title>万年历</title><link rel"styles…

C语言 | Leetcode C语言题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; struct ListNode* detectCycle(struct ListNode* head) {struct ListNode *slow head, *fast head;while (fast ! NULL) {slow slow->next;if (fast->next NULL) {return NULL;}fast fast->next->next;if (fast slow) {s…

LLVM Cpu0 新后端9 objdump readelf

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

EE trade:如何在A股市场中有效设定止盈止损点

A股市场充满机遇和风险&#xff0c;很多投资者在这里实现了财富增长&#xff0c;也有投资者在这里遭受损失。如何在波动性较大的市场中&#xff0c;控制风险&#xff0c;保护利润和本金?止盈止损是关键。 什么是止盈止损? 止盈止损是指在交易中&#xff0c;根据预先设定的条…

如何稳定高效地进行 TiDB 数据导入导出?

对于在数据库行业中摸爬滚打多年的老鸟 DBA 来说&#xff0c;TiDB 可是一点也不陌生&#xff0c;作为 PingCAP 公司自主研发的真开源分布式数据库&#xff0c;其先进的设计理念以及丰富的生态工具&#xff0c;可算得上是业界自主创新和性能领先的代名词。 TiDB 是谁&#xff1…

MAVEN架构项目管理工具

1、什么是maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 2、maven的目标&#xff1a;Maven的主要目标是为了使开发人员在最短的时间内领会项目的所有状态 3、使用maven不需要考虑各个依赖的版本&#xff0c;因…

【将xml文件转yolov5训练数据txt标签文件】连classes.txt都可以生成

将xml文件转yolov5训练数据txt标签文件 前言一、代码解析 二、使用方法总结 前言 找遍全网&#xff0c;我觉得写得最详细的就是这个博文⇨将xml文件转yolov5训练数据txt标签文件 虽然我还是没有跑成功。那个正则表达式我不会改QWQ&#xff0c;但是不妨碍我会训练ai。 最终成功…

UE5中在地形中加入湖、河

系统水资产添加 前提步骤123 完成 前提 使用版本 UE5.0.3,使用插件为UE内置的Water和water Extras. 步骤 1 记得重启 2 增加地形&#xff0c;把<启用编辑图层>勾选 如果地形没有勾选上编辑图层&#xff0c;那么就会导致湖、河等水景象无法融入地形。 如果忘记勾选…

Hive知识体系保姆级教程

一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了h…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

使用贝塞尔曲线实现一个iOS时间轴

UI效果 实现的思路 就是通过贝塞尔曲线画出时间轴的圆环的路径&#xff0c;然后 使用CAShaper来渲染UI&#xff0c;再通过 animation.beginTime [cilrclLayer convertTime:CACurrentMediaTime() fromLayer:nil] circleTimeOffset 来设置每个圆环的动画开始时间&#xff0c; …

探索ChatGPT-4在解决化学知识问题上的研究与应用

1. 概述 近年来&#xff0c;人工智能的发展主要集中在 GPT-4 等大型语言模型上。2023 年 3 月发布的这一先进模型展示了利用广泛知识应对从化学研究到日常问题解决等复杂挑战的能力。也开始进行研究&#xff0c;对化学的各个领域&#xff0c;从化学键到有机化学和物理化学&…

【设计模式】行为型设计模式之 备忘录模式(快照模式)

介绍 备忘录应用场景明确并且有限&#xff0c;一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复&#xff0c;备忘录模式能有效的节省时间和空间开销。 定义 备忘录模式&#xff1a;也称为快照模式&#xff0c;在不违背封装原则的前提下&#xff0c;捕获一个对象的内…