【问题标题】:How do I implement PriorityQueue for Dijkstra's algorithm?如何为 Dijkstra 算法实现 PriorityQueue?
【发布时间】:2017-11-04 22:34:54
【问题描述】:

我有一个关于为 Dijkstra 算法实现优先级队列的问题,因为这是一个硬件,所以我无法创建另一个类,所以我试图找到一种在优先级队列中添加节点(整数)的方法,但我想要队列对节点内部的权重进行排序,而不是节点本身。

例如,我有 3 个节点(0,1,2),节点 0 的权重为 10,节点 1 的权重为 15,节点 2 的权重为 5。

Queue<Integer> queue = new PriorityQueue<Integer>();
queue.add(0);
queue.add(1);
queue.add(2);

while(!queue.isEmpty()){
    System.out.println(queue.poll());
}

这应该给我 2,0,1 的输出。 在不创建另一个类的情况下这可能吗?或者除了优先级队列之外我可以使用其他方法吗?

先谢谢了!!!!!!任何帮助将不胜感激!

我能想到的一个解决方案是每次向其中添加节点时对普通队列进行排序,因此如果队列中有节点 2,0,1 并且我想添加权重为 8 的节点 3,我需要将权重与队列的顶部元素进行比较,直到它适合队列,因此队列中将是 2,3,0,1,但这有点低效。

【问题讨论】:

    标签: java algorithm sorting priority-queue dijkstra


    【解决方案1】:

    你有两个选择:

    1. 创建自己的Node 类,并使其实现Comparable&lt;Node&gt; 接口。该类将有一个weight 属性,它可以根据它们的权重比较Nodes。这将创建Nodes 中的natural orderingPriorityQueue 将使用它。

    2. 使用PriorityQueue(Comparator&lt;? super E&gt; comparator) 构造函数创建优先级队列。它需要一个比较函数 (Comparator) 来比较两个项目。因此,您可以使用节点的权重来比较该函数(不必将其保存在同一个队列中 - 可以动态计算或保存在某个单独的数据结构中)。

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2014-06-23
      • 2019-04-02
      • 2011-09-13
      相关资源
      最近更新 更多