【问题标题】:Implementing Dijkstra-like algorithm on grid在网格上实现类 Dijkstra 算法
【发布时间】:2015-07-30 20:51:45
【问题描述】:

我正在尝试编写一个在网格上运行的算法。它类似于 Dijkstra 的算法,但略有不同。

网格中的每个点要么被占用,要么空闲。我想检查距离起点小于一定距离的所有可到达点。

我假设我可以分别以 1 和 sqrt(2) 的成本平行于网格线或对角线行进。

最简单的方法是如果我有一个按值排序的地图。这样我可以将键设置为每个点的坐标,并将值设置为到目前为止计算的到该点的距离。我只需要弹出距离最小的条目,然后查找并更新邻居点的到目前为止距离。

这样的容器不存在,所以我一直在考虑可以组合哪些容器来获得相同的行为,但我无法想出任何可行的方法。

我在想我可以有一个 unordered_set 或 unordered_map 允许快速检索每个点的到目前为止的距离。对于 unordered_set,我可以定义一个 gridNode 对象,其中包含该点的位置和到目前为止的距离。

然后,我可以有一个向量,我可以对其进行排序并用于找到最短距离。

我只是不确定如何使这两个容器保持一致。向量是否包含指向 unordered_set 中条目的指针?向量是否可以包含网格点的坐标,我可以编写 std::sort 以便它使用 unordered_map 正确排序?

对此的任何想法将不胜感激。

【问题讨论】:

标签: c++ hashmap set containers dijkstra


【解决方案1】:

在处理 Dijkstra 和类似 Dijkstra 的算法时,priority queues 是你的朋友。标准 C++ 提供了一种带有std::priority_queue 的实现。您必须存储成对的坐标和距离,并定义一个只比较成对值的自定义比较器。

【讨论】:

  • 如果我想使用优先级队列,我不需要能够在插入后更改优先级吗?我认为 priority_queue 不允许这样做。
  • @user2445507 不,只需再次插入坐标。由于新条目的距离较短,它会出现在旧条目之前。距离较远的较旧条目将永远不会出现,或者至少不会导致更短的路径。 (无论如何,您都必须存储已访问/已解决的节点列表。)
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2015-02-05
  • 1970-01-01
  • 2020-08-15
  • 2021-04-21
相关资源
最近更新 更多