Dijkstra算法和A*算法总结
Dijkstra算法和A*算法都是最短路径问题的常用算法,下面就对这两种算法的特点进行一下比较:
- Dijkstra算法计算源点到其他所有点的最短路径长度,A*关注点到点的最短路径(包括具体路径)。
- Dijkstra算法建立在较为抽象的图论层面,A*算法可以更轻松地用在诸如游戏地图寻路中。
- Dijkstra算法的实质是广度优先搜索,是一种发散式的搜索,所以空间复杂度和时间复杂度都比较高。对路径上的当前点,A*算法不但记录其到源点的代价,还计算当前点到目标点的期望代价,是一种启发式算法,也可以认为是一种深度优先的算法。
- 由第一点,当目标点很多时,A*算法会带入大量重复数据和复杂的估价函数,所以如果不要求获得具体路径而只比较路径长度时,Dijkstra算法会成为更好的选择。
启发函数的性质
那么能不能综合上面Dijkstra算法得到最优解和贪心算法速度快的特点,有更好的办法呢?
【注意一下这个地方,Dijkstra算法是适用于任何图算法找最短距离均可的,但是用到启发式算法的话,大部分情况下会是一个方格图,因为只有方格图才能比较好的估算从当前点到终点的距离】
那么我们可以先定义一个估算函数
其中 g(n) 表示起点到当前点 n 实际走的代价, h(n) 表示当前点 n 到终点的估算代价。
所以上面两个合起来就是其走当前点到终点的总代价函数 f(n)
而 h(n) 这个估计函数不同的估计情况,结果也不会相同。
- 先考虑极端情况, 如果h(n)=0的情况下,只有g(n)起作用,那么A*算法就是Dijkstra算法。
- 如果h(n)始终小于等于实际n点到终点的距离,那么必然能够保证A*算法找的解就是最优解。而且h(n)越小,则A*扩展的节点也就越多,A*算法运行的也就越慢。
- 如果h(n)始终都等于实际n点到终点的距离,那么A*算法只会严格走从起点到终点的最短路径。虽然这种情况一般不可能发生,当然一些特殊情况下会发生【比如没有障碍物的情况】。
- 如果h(n)有时候大于实际n点到终点的距离,那么不能保证A*算法能够找到最短路径
- 另外一种极端情况,就是如果只有h(n)发挥作用,则A*算法就相当于贪心算法。
Dijkstra算法和A*算法总结相关推荐
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...
- 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法
第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...
- dijkstra算法和A*算法
转自: https://www.cnblogs.com/21207-iHome/p/6048969.html#undefined Dijkstra算法 迪杰斯特拉(Dijkstra)算法是典型的最短路 ...
- Dijkstra算法和Floyed算法
Dijkstra算法和Floyed算法 最短路径: 在非网图中,最短路径是指两顶点之间经历的边数最少的路径. 在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径. 最短路径问题: 单源点到其 ...
- 最短路径(Dijkstra算法和Floyd算法)
最短路径 在图中,不可避免要解决的一个问题就是计算两点之间的最短路径,对于图结构来说,两个点之间不一定只有一条路径,那么如何才能找出最短的那一条就是图中最短路径问题.最短路径问题在实际生活中应用十 ...
- 最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 最短路径:Dijkstra算法和Floyd算法
一.Dijkstra算法(单个顶点到其他顶点的最短距离) 定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...
- Dijkstra算法和Floyd算法详解(MATLAB代码)
一.Dijkstra算法 1.算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法.算法解决的是有 ...
- dijkstra算法和floyd算法(C语言)
dijkstra算法: /* 邻接表存储 - 无权图的单源最短路算法 *//* dist[]和path[]全部初始化为-1 */ void Unweighted ( LGraph Graph, int ...
最新文章
- 受用一生的高效 PyCharm 使用技巧(一)
- Mysql5.6-DDL是否加锁
- JPA EnableJpaAuditing 审计功能
- PCA 主成分分析 用Excel一步步演算过程详解
- java interfaceof,java interface教程
- Linux服务器安装svn
- Mono 之 单元测试
- Hadoop配置文件详解
- 商业计划书(BP)应该包含哪些点?看 BP 的人最想从中得到什么?
- 深度学习:Nvidia显卡驱动安装
- 近期购书体验:当当相对最棒,卓越蜗牛,京东缺货
- 用python做网站的步骤_Python建网站的步骤
- 千年虫与2038年问题
- 方格网的填方和挖方计算
- iOS Bug---CoreLocation 部分机型卡界面
- java -version 自动被切换的问题 : C:\ProgramData\Oracle\Java\javapath;
- Python3寻找相同图片
- vbs和java有关系吗_Java程序员所需的批处理和VBS脚本 (转载)
- Druid连接池实现数据库加密
- c语言16进制转换成文本显示,文本如何转换成16进制字节集数据
热门文章
- 蓝牙版本应该如何选择
- ubuntu20.04安装到u盘+配置美化
- 最近火爆的外卖分销小程序搭建及推广秘籍
- Deinterlacer(影像解交错)概念与解析
- 【100%通过率】华为OD机试真题 C++ 实现【简单的自动曝光】【2022.11 Q4 新题】
- charles问题,chls.pro/ssl 证书无法在小米手机下载 ?(最详细的解决方案,其他手机也可以适用)
- AtCoder Regular Contest 105 C - Camels and Bridge
- Git 04 ---用Idea合并git分支
- Autodesk Inventor: Presentations Autodesk Inventor 教程之Presentations Lynda课程中文字幕
- oracle设置session空闲时间超时断开