【问题标题】:C++ - what data structures for Dijkstra's should I use?C++ - 我应该使用 Dijkstra 的哪些数据结构?
【发布时间】:2019-05-14 02:13:00
【问题描述】:

任务是:

找出两个城市之间的最短路径。城市与单向道路相连。 城市以这种方式存在于 .txt 文件中:

// 从 // // 到 // // 距离 //

例如:

伦敦格拉斯哥 180

曼彻斯特利物浦 80

约克剑桥 415

约克曼彻斯特 260

格拉斯哥约克 315

格拉斯哥曼彻斯特 315

给定一个源城市 S 和目标城市 T,找到最短路径。计算距离并检索所采取的路径。

问题是:我根本不允许使用任何 STL 容器。不能使用 std::list、std::vector、std::pair、std::set 等容器。但是,我可以使用自己实现的动态数据结构。

我不知道应该实现哪些数据结构以及如何实现它们。 另外,我应该使用优先级队列、堆还是其他东西? 还想知道邻接表或邻接矩阵。

我真的不在乎解决方案是否经过优化。

我一直在谷歌上搜索,但我发现的所有 Dijkstras 算法实现都使用了大量的 STL 容器,我不允许使用这些容器。

感谢任何提示、提示或链接。谢谢。

【问题讨论】:

  • 您可以使用标准库从这些示例中推断出您需要的数据结构,即使您不允许直接使用它。看到你的作业,我怀疑你至少应该使用图表。
  • 要实现 Dijkstra 的:您需要一个优先级队列(又名排序列表)和一个集合(可以实现为一个列表)。保持当前边界的优先级队列,您选择下一个要处理的项目作为队列中具有最短路径的项目(因此优先级是到城市的距离)。您需要一组来跟踪您已经到达的城市。该算法需要一种在给定当前城市的情况下找到一组连接城市和距离的方法。因此,要实现 Dijkstra 的最小数据结构,您需要一个列表和您城市的接口)
  • 我根本不允许使用任何 STL 容器。 -- 是的,因为如果你使用 STL,程序就会神奇地自行编写。 (我希望你知道那是讽刺......)。如果你使用STL,你会用什么?
  • 令我惊讶的是,有多少教师分发作业并禁止 STL,然后我们想知道为什么我们一直在采访不了解 STL 的人。

标签: c++ data-structures dijkstra adjacency-matrix adjacency-list


【解决方案1】:

要编写 Dijkstra 的最短路径算法,您只需要实现一个优先级队列(最小堆)。

我首先推荐堆。集合的实现涉及(几乎)平衡的二叉搜索树,如 AVL 或红黑树或 Treap(笛卡尔树),这样的代码比实现堆要难几个数量级。此外,所有这些解决方案都具有相同的运行时间O(log n),因此更容易编码的解决方案排在第一位。

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多