学习笔记分享-数据结构与算法-图-Dijkstra(算法描述、算法实现)

前言

  • 图片上面的personal表示只有图片上面的一行语句是解释图片内容的、local表示这个图片所在标题下的所有语句都是解释图片内容的、global表示有多个标题下的所有语句都是解释图片内容的
  • 我是一名大二的学生,学了差不多一年java技术栈了,想记录一下自己对知识点的心得,目前还是个小白,期望大佬们可以指出我笔记中的不足之处、对知识点的认知错误、笔记结构的混乱等
  • 这些图片内容都是在观看黑马课程时的视频截图

文章目录

  • 前言
  • 学习了 p81(图-Dijkstra-算法描述)
    • 1. 算法前置条件与目的
    • 2. 算法思想
    • 3. 已处理顶点的距离不会再更改的延伸实例
  • 学习了 p82(图-Dijkstra-算法实现)
    • 1. 前置条件准备
    • 2. 相关方法
      • 2.1 dijkstra 方法
        • 2.1.1 方法参数
          • 2.1.1.1 graph 参数
          • 2.1.1.2 source 参数
        • 2.1.2 方法体
      • 2.2 chooseMinDistVertex 方法
        • 2.2.1 方法参数
          • 2.2.1.1 list 参数
        • 2.2.2 方法体
      • 2.3 updateNeighboursDist 方法
        • 2.3.1 方法参数
          • 2.3.1.1 curr 参数
          • 2.3.1.1 list 参数
        • 2.3.2 方法体

学习了 p81(图-Dijkstra-算法描述)

1. 算法前置条件与目的

  • 前置条件: 图中必须只有一个起点
  • 目的: 找到每个顶点与起点的最小距离

2. 算法思想

  • 每次选择最有价值被处理的顶点,也就是距离起点最近的顶点
  • 每次选择距离起点最短的顶点可以保证被处理过的顶点的距离不会再被更改,也就是找到了顶点的最短距离
  • 整个过程其实是逐步固定顶点距离(找到最小距离),并根据已确定的距离来尝试更新相邻顶点距离的过程
    • 对于起点顶点,可以将他的最小距离看成 0,固定起点顶点后,尝试更新其相邻顶点的距离,接着找到未处理顶点中距离起点最小的顶点,为何要找距离最小的顶点呢,假设有 A (距离起点距离为 1)、B(距离起点为 3)、C… 若干个顶点,很明显不可能存在其他路径可以使得起点到 A 的距离小于 1,如果你不选择距离起点最小的顶点 A,而是选择B,那么你很有可能找到其他的路径使得起点到 B 的距离小于 3,比如假设存在 A->B 这条路径且权重为 1,那么起点->A->B 的距离只有 2,因此我们要固定距离起点最近的那个顶点,然后据此又再次计算固定距离的顶点所关联顶点的距离,以此类推直到固定所有的顶点的距离
    • 这里额外补充一点,如果固定的顶点的距离并不是未处理顶点中最小距离的那个顶点,然后你据此尝试更新他相邻顶点的距离,这些更新也是无意义的,因为固定的顶点的距离并不一定正确

3. 已处理顶点的距离不会再更改的延伸实例

  • 前提说明: 字母后的数字 1 表示被选取顶点、2表示没有未处理顶点
  • Dijkstra 算法处理顶点的含义: 尝试更新当前顶点关联的还未被处理过的顶点的距离
  • 顶点关系:
3
2
1
2
A1
B2
C2
D2
  • 按照 Dijkstra 算法,待 A 被处理完会先处理 C,然后 C 处理完后会处理 B,注意 B 又关联了 C,但是 C 已经处理过了,根据算法特点如果 C 被处理过了那么说明起点到 C 的距离一定比起点到 B 的距离小,那么从起点到B 再到 C 的这条路的距离肯定不是起点到 C 的最短距离,因此并不用尝试更新 C 顶点与起点的最短距离
  • global

学习了 p82(图-Dijkstra-算法实现)

1. 前置条件准备

  • 为 Vertex 类添加一个 dist 属性用于表示临时的距离起点最短的距离
  • 对于起点顶点 dist 为 0,其余顶点的 dist 为无穷大
  • 通过 Vertex 类和 Edge 类构建一个图
  • local

2. 相关方法

2.1 dijkstra 方法

2.1.1 方法参数
2.1.1.1 graph 参数
  • 参数含义: 存储图中所有顶点的集合
2.1.1.2 source 参数
  • 参数含义: 图中的起点顶点
2.1.2 方法体
  • 准备一个集合来存储已经处理过的顶点
  • 将起点顶点的 dist 设为 0
  • 构建循环,直到 graph 集合为空
    • 调用 chooseMinDistVertex 方法获取 dist 最小的顶点 curr
    • 调用 updateNeighboursDist 方法可以尝试更新 curr 的相邻顶点的 dist
    • 从 graph 中移除 curr
  • global

2.2 chooseMinDistVertex 方法

2.2.1 方法参数
2.2.1.1 list 参数
  • 参数含义: 存储图中未处理顶点的集合
2.2.2 方法体
  • 选取集合中第一个顶点为默认的 dist 最小的顶点
  • 遍历集合中剩余的顶点,试图找到 dist最小的顶点
  • 返回 dist 最小的顶点即可
  • global

2.3 updateNeighboursDist 方法

2.3.1 方法参数
2.3.1.1 curr 参数
  • 参数含义: 未处理顶点中 dist 最小的顶点
2.3.1.1 list 参数
  • 参数含义: 未处理顶点的集合
2.3.2 方法体
  • 遍历curr 所关联的所有顶点
    • 如果该顶点没有被处理过的话才尝试更新其 dist 为 curr 的 dist+相应的weight
    • 如果顶点被处理过了,顶点的距离不可变,因此不用尝试更新该顶点的 dist
  • global

你可能感兴趣的:(算法,学习,笔记)