algorithm - 为什么 Djikstra 算法需要跟踪步数?

标签 algorithm path-finding

我可以理解跟踪累积距离、每条路径的距离以及跟踪顶点的名称(或位置),但是为什么要跟踪步数除非你想跟踪它的效率到达目的地了吗?

这一步对于寻找路径是完全没有必要的,而且看起来相当随意。例如,如果您有多个顶点,其中累积距离相同且数字最小,则没有理由关心您从哪一个开始,但无论哪个顶点都会被标记为下一步。

我看到周围有很多代码,它们通常遵循跟踪步骤的原则。这看起来很奇怪,尤其是当他们中的许多人在移动成本为 1 或无穷大的 2D 矩阵上进行寻路时。在那种情况下,在我看来,不仅每个顶点的步数是多余的,而且唯一需要关心的信息是顶点的距离和标签。如果你有一个距离,你就知道你已经访问了顶点,并且由于所有距离都相同,所以你第一次到达一个顶点应该总是它的最低距离。没有必要评估它是更低还是更高,只需要它存在即可。

无论如何,我很好奇为什么这么简单的东西会收集到多余的信息。有什么原因让我无法理解吗?

编辑--

为了更清楚一点,并且由于评论中的格式不正确,该步骤通常显示在人们告诉您使用的表格中。

____________________
|name|step|distance|
--------------------
|temporary Labels  |
--------------------

当一个位置是到原点的下一个最短点时添加该步骤。

最佳答案

好的,我现在已经看过那个视频了,这实际上是我第一次看到这样的 table 被使用。这对我来说没有多大意义。它完全混合了“标签”和“距离”;永久标签是标记节点的顺序,而临时标签是当前的非固定距离。这些都不是必需的。

相反,您通常拥有的节点如下:距离(从起始节点开始)、(或前一个)节点和一个mark 将节点标记为已完成或未完成(在实现中,您通常为所有未标记的节点设置一个优先级队列)。

然后您继续查看总距离最小的未标记节点,标记它并更新所有未标记邻居的距离。每当您更新到更短的距离时,您也会更新父节点。

但您绝对不需要具有将节点标记为已完成的顺序或具有所有先前未完成的距离。对我来说,在那个视频中,这似乎只是一种更容易检查学生作业的方法,因为如果没有相同的距离,你总是有一个单一的顺序来查看顶点。

也就是说,正常的Dijkstra algorithm不包括这些东西,也没有必要。查看pseudocode在维基百科上获取有关您实际存储内容的实现细节(如前所述,您通常只有每个节点的距离和父节点,以及未标记节点的优先级队列)。

It seems very strange, especially when many of them are pathfinding on a 2D matrix where the cost of movement is either 1 or infinite.

您在这里描述的是一个非常特殊的情况。 Dijkstra 算法实际上用于许多图问题,其中距离 相等,并且连接更多,每个方向只有 4 个简单的邻居。

关于algorithm - 为什么 Djikstra 算法需要跟踪步数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437917/

相关文章:

java - UVA#523 最低运输成本

python - 循环列表的排列并对它们应用函数

javaFX:错误的合并排序动画结果

c++ - 如何在 C++ 中通过相交或不相交对子 vector 进行分组

java - 如何根据二维数组上的特定位置获取网格单元的状态

c++ - 递归算法的实现

algorithm - 局部波束搜索和随机波束搜索有什么区别?

database - 维护 "ordering string"以排序数据库元素的算法

添加节点的效果未知时寻找最便宜路径的算法

Python:A *从具有经度和纬度的数据框路由