【第二十六天 - Dijkstra 介绍】

Q1. Dijkstra 是什麽?

  • 一种利用 Dynamic Programming ,与 Floyd-Warshall 一样,是求 Graph 中两点之间最短路径的演算法。
  • Floyd-Warshall 是计算「每一个点」到其他点的最短路径
  • Dijkstra 是计算「某一个点」到其他点的最短距离

条件限制:

Dijkstra 适用的 graph 中,不可以有负权重的边。

流程:

  1. 选择一个起点,以下图为例,我们假设起点为第 0 点

  2. 将起点「直接相邻」的节点权重视为最短路径长,其他结点的路径长则视为无限大。
    https://ithelp.ithome.com.tw/upload/images/20210926/20140592LieiNntrhD.png

  3. 选取距离最近的节点,如 0→1 与 0→2 两条路径,选择第1点目前路径较短的开始看,由於不可能有其他路径比当前的更短了(因为图中无负权重,要从其他节点过来一定会更远),我们可以确定此距离就是真正的最短距离。

  4. 从当前选取的节点(第1点)出发前往其他节点(相邻的点有2与3),如果能比已知的路径长更短(0→2原本纪录为4,0→1→2=3,选最短路径的3),就更新已知的路径长;如果需要知道最短路径的确切节点,可以在更新时一并纪录前一节点。

https://ithelp.ithome.com.tw/upload/images/20210926/20140592G9lOOS5xaz.png

  1. 反覆 3 ~ 5 ,直到所有节点都找到最短路径。
    https://ithelp.ithome.com.tw/upload/images/20210926/201405924ganunziyC.png

https://ithelp.ithome.com.tw/upload/images/20210926/20140592WDnnJZYxoz.png

https://ithelp.ithome.com.tw/upload/images/20210926/20140592LRMAal8QyM.png

https://ithelp.ithome.com.tw/upload/images/20210926/20140592SGCBEHwCNy.png

https://ithelp.ithome.com.tw/upload/images/20210926/20140592DeCeyTZjt2.png

参考资料:https://ithelp.ithome.com.tw/articles/10209593

参考资料:https://ithelp.ithome.com.tw/articles/10238059

Q2. 学会 Dijkstra 概念可以做什麽 ?

可以求 Graph 中两点之间的最短路径。

Lab. 明天要解的题目:1514. Path with Maximum Probability

  • 题目连结:https://leetcode.com/problems/path-with-maximum-probability/

  • 题目叙述

    • 题目给 n 个节点,并且 edges 会储存从 a 点到 b 点的边(无向图),succProb 储存 a 点到 b 点的「成功概率」
    • 计算从 start 点到 end 点的最大成功机率,若无法抵达,则回传0
      https://ithelp.ithome.com.tw/upload/images/20210926/20140592pBQhLGYw7p.png
  • 测资的 Input/Output

    • 如范例1,第0点抵达第2点有两种走法: 0→1→2 与 0→2
    • 需要回传 start → end 点最高成功机率: max(0→1→2 ,0→2) = max(0.5*0.5,0.2) = 0.25
      https://ithelp.ithome.com.tw/upload/images/20210926/20140592jofRPSXkm1.png
      https://ithelp.ithome.com.tw/upload/images/20210926/201405925mXPvSZtxz.png
  • 题目的条件

    • 会有 2~10000 个点
    • start 与 end 介於 0~10000 间
    • start 与 end 不会是同一个点
    • edges 中的点,会是介於 0~10000间
    • edges 所记录的 a 点到 b 点不会是同一个点
    • 「edges 纪录的边长」会与 「succProb 的成功机率」数量相同,并介於 0~20000 间
    • succProb 成功机率介於 0~1 之间
    • 两个点之间,最多只有一条边
      https://ithelp.ithome.com.tw/upload/images/20210926/201405927D7TixZlK0.png

<<:  使用WiringPi

>>:  软件开发流程 需求蒐集法1 - 问卷

Day2:进入新手村前先让我复习一下QQ-CSS-clear 清除浮动

clear 清除浮动 浮动元素顾名思义就是浮动在版面之上,所以如果接着顺序往下写的程序码没有使用cl...

予焦啦!一梦终须醒......

佳作之後 承蒙评审给予肯定,最直接的感谢方式就是狗尾续貂一番。 沈淀了一个多月,我时常咀嚼结语中故作...

成员 2 人:别公平、别相爱、别把友情当应该

「一支筷子易折断,两支筷子好夹菜。」 两个人很常一起 IT 创业的原因是: 你是设计师,我是工程师 ...

[Day01] 学了 React 後的下一步?准备好两把刷子!

学了 React 之後的下一步,还能学什麽呢? 在今年的铁人赛中,想要来分享这一两年来开始使用的 T...

【Day 21】- 你的爬虫还在用帐号密码进行登入? 带上 Session 吧!(实战 Selenium 自动点击 Instagram 好友贴文赞 1/2)

前情提要 前一篇带各位在 Selenium 中透过执行 JavaScript 语句达到向下卷动的效果...