当前位置: 首页 > news >正文

数据结构与算法-17高级数据结构_图论(迪杰斯特拉算法)

迪杰斯特拉算法

1 是什么?

迪杰斯特拉算法(Dijkstra’s Algorithm),又称狄克斯特拉算法,是由荷兰计算机科学家埃德加·狄克斯特拉(Edsger Dijkstra)于1959年提出的一种用于解决有权图中最短路径问题的算法。该算法的核心思想是从一个指定的源点出发,逐步求出源点到图中其他所有顶点的最短路径。

  • 提出者:埃德加·狄克斯特拉(Edsger Dijkstra)
  • 提出时间:1959年
  • 应用领域:主要用于求解有权图(包括有向图和无向图)中的单源最短路径问题

2 实现

2.1 基本实现

  1. 初始化:选择一个源点,将图中所有顶点的最短路径估计值设为无穷大(表示未知),将源点的最短路径估计值设为0。
  2. 创建集合:创建两个集合,一个用于存储已经找到最短路径的顶点(通常称为已访问集合),另一个用于存储尚未找到最短路径的顶点(通常称为未访问集合)。
  3. 选择最小值顶点:从未访问集合中选择一个具有最小最短路径估计值的顶点,称为当前顶点。
  4. 更新邻居:遍历当前顶点的所有邻居,计算从源点经过当前顶点到邻居的路径长度。如果这个长度小于邻居当前的最短路径估计值,则更新邻居的最短路径估计值。
  5. 移动顶点:更新完当前顶点的所有邻居后,将当前顶点从未访问集合移动到已访问集合。
  6. 重复过程:重复步骤3到5,直到未访问集合为空,或者所有顶点的最短路径都被找到。
  7. 构造最短路径:如果需要,可以通过回溯每个顶点的最短路径估计值来构造出从源点到该顶点的最短路径。
  8. 详细步骤见下文图解

2.2 算法特性

  • 贪心算法:迪杰斯特拉算法是贪心算法的一个例子,它在每一步选择局部最优解(即当前顶点的最短路径估计值最小的顶点),以期望获得全局最优解。
  • 适用于稠密图:当图中的边远多于顶点时,迪杰斯特拉算法相对于贝尔曼-福特算法通常更高效。

2.3 图解示例

在这里插入图片描述

在这里插入图片描述

2.4 代码示例

package cn.zxc.demo.leetcode_demo.advanced_data_structure.graph;/*** 求有权图最短路径:迪杰斯特拉算法*/
public class Dijkstra {// 有权有向图private int[][] graph;// 节点距离private int[] dist;/*** 构建一个有v个顶点的有权有向图* @param v*/public Dijkstra(int v) {this.graph = new int[v][v];this.dist = new int[v];// 初始化距离数组,初始值为无限大,这是使用Integer.MAX_VALUE表示for (int i = 0; i < v; i++) {dist[i] = Integer.MAX_VALUE;}}/*** 初始化 有向图* @param inits*/public void init(int[][] inits){for (int[] init : inits) {graph[init[0]][init[1]] = init[2];}}public int dijkstra(int src, int dest) {// 创建一个数组,记录已经访问过的顶点int visitedNum = 0;// 创建一个数组,记录未访问过的顶点boolean[] unvisited = new boolean[graph.length];for (int i = 0; i < graph.length; i++) {unvisited[i] = true;}// 将原节点的距离设置为0dist[src] = 0;// 计算每一个顶点到src的最短距离while (visitedNum < graph.length){// 获取到第一个顶点:距离原点距离最短的顶点int min = -1;for (int i = 0; i < unvisited.length; i++) {if (unvisited[i] && (min == -1 || dist[i] < dist[min])){min = i;}}if (min == -1){break;}// 根据当前顶点更新最短距离for (int i = 0; i < graph.length; i++) {if (graph[min][i] != 0 && dist[min] + graph[min][i] < dist[i] && unvisited[i]){dist[i] = dist[min] + graph[min][i];}}// 更新已访问过的节点集合visitedNum++;unvisited[min] = false;}return dist[dest];}public static void main(String[] args) {// 见上图int[][] inits = {{1, 3, 10}, {1, 5, 30}, {1, 6, 100}, {2, 3, 5}, {3, 4, 50}, {5, 4, 20}, {4, 6, 10}, {5, 6, 60}};Dijkstra dijkstra = new Dijkstra(7);dijkstra.init(inits);System.out.println(dijkstra.dijkstra(1, 6));}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《黑神话:悟空》本地存档误删了怎么恢复?三种方法!
  • PHP7 json_encode() 浮点小数溢出错误
  • 攻防世界 ics-05
  • 【原创】java+swing+mysql项目管理系统设计与实现
  • OPENAIGC开发者大赛高校组银奖 | LonAC中小学编程学习平台
  • 借助MoAiStudio不写一行代码,完成页面开发
  • Redis的IO模型
  • 如何使用UWA Gears连接模拟器进行性能测试
  • Spring部分常见面试题
  • 记录k8s重启之后kubelet无法启动的问题
  • 数据库的实施过程分析
  • jeecg的单点登录
  • 如何使用YOLOv5进行物体检测,并通过GraspNet进行6D位姿估计,从而实现机械臂的抓取规划
  • misc音频隐写
  • 《代码整洁之道》读书笔记--目录
  • 2019年如何成为全栈工程师?
  • Cookie 在前端中的实践
  • k个最大的数及变种小结
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • TypeScript迭代器
  • vue--为什么data属性必须是一个函数
  • 创建一种深思熟虑的文化
  • 基于web的全景—— Pannellum小试
  • 类orAPI - 收藏集 - 掘金
  • 前端技术周刊 2019-02-11 Serverless
  • 日剧·日综资源集合(建议收藏)
  • 时间复杂度与空间复杂度分析
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 交换综合实验一
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #laravel 通过手动安装依赖PHPExcel#
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (04)odoo视图操作
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)Hilt的基本概念和使用
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)(4.6) Triducer
  • (7)摄像机和云台
  • (a /b)*c的值
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)JAVA使用POI操作excel
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)网络优化与超参数选择--九五小庞
  • (转)3D模板阴影原理
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)