IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法学习-最短路Dijkstra算法 -> 正文阅读

[数据结构与算法]算法学习-最短路Dijkstra算法

概念介绍

本博客在学习北京大学陈斌老师《数据结构与算法》MOOC课程中总结反思形成。

最短路问题

  • 带权图上最短路径的问题
  • 词梯问题的高阶形式(可以认为词梯问题是权重都一致的最短路问题)

Dijkstra算法

  • 一个迭代算法,得出从一个顶点到其余所有顶点的最短路径

实现步骤

准备阶段

  • 在顶点Vertex类中的成员dist用于记录从开始顶点到本顶点的最短带权路径长度(权重之和)
  • 顶点的访问次序由一个优先队列来控制,队列中作为优先级的是顶点的dist属性。

实现阶段

  • 只有开始顶点dist设为0,而其他所有顶点dist设为sys.maxsize(最大整数),全部加入优先队列
  • 随着队列中每个最低dist顶点率先出队,并计算它与邻接顶点的权重,会引起其它顶点dist的减小和修改,引起堆重排
  • 并据更新后的dist优先级再依次出队。

可视化

image-20211027200330742

算法复杂度分析

  • 所有顶点加入优先队列并且建堆,时间复杂度 O ( ∣ V ∣ ) O(|V|) O(V);
  • 每个顶点仅出队1次,每次delMin花费 O ( l o g ∣ V ∣ ) O(log|V|) O(logV),一共是 O ( ∣ V ∣ l o g ∣ V ∣ ) O(|V|log|V|) O(VlogV);
  • 每个边关联到的顶点做一次decreaseKey操作( O ( l o g ∣ V ∣ ) O(log|V|) O(logV)),一共是 O ( ∣ E ∣ l o g ∣ V ∣ ) O(|E|log|V|) O(ElogV);
  • 综上所述:数量级是 O ( ( ∣ V ∣ + ∣ E ∣ ) l o g ∣ V ∣ ) O((|V|+|E|)log|V|) O((V+E)logV)

代码实现

最短路代码

陈斌老师实现的最短路算法

def dijkstra(aGraph, start):
    pq = PriorityQueue()
    start.setDistance(0)
    # 对所有顶点建堆,形成优先队列
    pq.buildHeap([(v.getDistance(), v) for v in aGraph])
    while not pq.isEmpty():
        # 优先队列出队
        currentVert = pq.delMin()
        for nextVert in currentVert.getConnections():
            newDist = currentVert.getDistance() + currentVert.getWeight(nextVert)
            if newDist < nextVert.getDistance():
                # 修改出队顶点所邻接顶点的distm并逐个重拍队列
                nextVert.setDistance(newDist)
                nextVert.setPred(currentVert)
                pq.decreaseKey(nextVert, newDist)

自己为调用该算法实现的图的创建和路径回溯

最短路图的创建

这里为了方便以后的调用,考虑到邻接矩阵使用的广泛性,实现了给定邻接矩阵,创建邻接表图

# 实现邻接矩阵转化为邻接图
def Matrix2Graph(LJGraph, LJmatrix):
    for i in range(len(LJmatrix)):
        LJGraph.addVertex(i)

    for i in range(len(LJmatrix)):
        for j in range(len(LJmatrix[0])):
            if i != j:
                LJGraph.addEdge(i, j, LJmatrix[i][j])

    # 检验构造的图的正确性
    for v in LJGraph:
        for w in v.getConnections():
            print("%s,%s" % (v.getId(), w.getId()))
            print(v.getWeight(w))

路径回溯

在Dijkstra算法求解出最短路后,回溯出终点到起点的最短路径

def traverse(y):
    x = y
    _temp = []
    _temp.append(x.getId())
    while (x.getPred()):
        _temp.append(x.getPred().getId())
        x = x.getPred()
    return _temp

调用示例

if __name__ == '__main__':
    LJGraph = Graph()
    LJmatrix = [[0, 2, 5, 1, sys.maxsize, sys.maxsize],
                [2, 0, 3, 2, sys.maxsize, sys.maxsize],
                [5, 3, 0, 3, 1, 5],
                [1, 2, 3, 0, 1, sys.maxsize],
                [sys.maxsize, sys.maxsize, 1, 1, 0, 1],
                [sys.maxsize, sys.maxsize, 5, sys.maxsize, 1, 0]]

    # 复习:对于基础的二维列表,利用len获取形状
    # print(LJmatrix)
    # print(LJmatrix[0][1])
    Matrix2Graph(LJGraph, LJmatrix)

    # 如何使用Dijkstra(迪杰斯特拉算法)算法
    dijkstra(LJGraph, LJGraph.getVertex(0))

    # 如何反向调用得到图的解
    path = traverse(LJGraph.getVertex(5))
    print(path)
    dijkstra(LJGraph, LJGraph.getVertex(0))

    # 如何反向调用得到图的解
    path = traverse(LJGraph.getVertex(5))
    print(path)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:36:29  更:2021-10-28 12:38:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 18:57:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码