为什么Dijkstra的算法需要跟踪步数?

时间:2013-05-08 10:07:15

标签: algorithm path-finding

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

这个步骤对于找到路径是完全没必要的,而且无论如何它似乎相当随意。例如,如果你有多个顶点,其中累积的距离是相同的,并且是最小的数字,则没有理由关心你从哪一个开始,但是无论哪一个被标记为下一步行。

我看到很多代码,他们通常遵循跟踪步骤的原则。这似乎很奇怪,特别是当它们中的许多人在2D矩阵上进行寻路时,其中运动成本是1或无限。在这种情况下,在我看来,不仅每个顶点的步数是多余的,而且唯一需要被打扰的信息是顶点的距离和标签。如果你有一个距离,你知道你已经访问了顶点,并且由于所有距离都是相同的,所以第一次到达顶点应始终是它的最低距离。不评估它是低还是大是必要的,只有它存在。

无论如何,我只是好奇为什么这么简单的东西应该收集多余的信息。有什么理由我只是不抓?

编辑 -

要添加一点清晰度,并且由于评论中没有正确格式化,该步骤通常显示在人们告诉您使用的表格中。

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

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

1 个答案:

答案 0 :(得分:2)

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

相反,您通常对节点所拥有的内容如下:距离(来自起始节点),(或上一个)节点以及标记将节点标记为已完成(在实现中,您通常会为所有未标记的节点设置优先级队列)。

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

除非您需要将节点标记为已完成或具有所有先前不完整的距离,否则无法执行此操作。对我来说,在那个视频中,似乎只是一种方法可以让你更容易检查学生的工作,因为如果没有相同的距离你总是只有一个订单来查看顶点。

话虽这么说,正常Dijkstra algorithm不包括这些东西,并没有必要。有关实际存储内容的实现详细信息,请参阅维基百科上的pseudocode(如上所述,您通常只有每个节点的距离和父节点,以及未标记节点的优先级队列)。

  

这似乎很奇怪,尤其是当它们中的许多人在2D矩阵上进行寻路时,其中运动成本为1或无限。

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