一旦PriorityQueue中的对象的优先级发生了改变,Java是否可以轻松地重新评估一个堆? 我无法在Javadoc中find任何迹象,但必须有办法做到这一点,对不对? 我目前正在删除对象,然后重新添加它,但是这显然比在堆上运行更新慢。
由于std::priority_queue和std::set (和std::multiset )都是数据容器,它们存储元素并允许以有序方式访问它们,并具有相同的插入复杂度O(log n) (或者,什么样的情况需要这个或那个?)? 虽然我知道潜在的结构是不同的,但我并不那么感兴趣,因为我在比较它们的性能和各种用途的适用性 。 注:我知道一套中没有重复。 这就是为什么我还提到了std::multiset因为它具有与std::set完全相同的行为,但是可以在允许存储的数据作为相等元素进行比较的情况下使用。 所以,请不要评论单个/多个密钥的问题。
我试图声明priority_queue of nodes的priority_queue of nodes ,使用bool Compare(Node a, Node b)作为比较函数(这是在节点类之外)。 我目前拥有的是: priority_queue<Node, vector<Node>, Compare> openSet; 出于某种原因,我收到Error: "Compare" is not a type name 将声明更改为priority_queue <Node, vector<Node>, bool Compare> 给我Error: expected a '>' 我也试过: priority_queue<Node, vector<Node>, Compare()> openSet; priority_queue<Node, vector<Node>, bool Compare()> openSet; priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet; 我应该如何正确地声明我的priority_queue ?
相关问题: 具有固定大小的Java PriorityQueue 我如何使用PriorityQueue? 获取数组中n个最小元素的索引 Scala:有没有像我在Java中一样使用PriorityQueue的方法? 我有一个非常大的数据集 (超过500万个项目),我需要从它得到N个最大的项目。 最自然的方法是使用堆栈/优先级队列, 只存储前N个项目 。 对于JVM(Scala / Java),有几个优先级队列的实现,即: scala.collection.mutable.PriorityQueue java.util.PriorityQueue中 lucene.util.PriorityQueue 前两个是不错的,但他们存储所有的项目,在我的情况下给重要的内存开销。 第三(Lucene的实现)没有这样的缺点,但正如我从文档中看到的,它也不支持自定义比较器,这对我来说是无用的。 所以,我的问题是:有固定容量和自定义比较器的PriorityQueue实现吗? UPD。 最后,我根据Peter的回答创build了自己的实现: public class FixedSizePriorityQueue<E> extends TreeSet<E> { private int elementsLeft; public FixedSizePriorityQueue(int maxSize) { super(new NaturalComparator()); this.elementsLeft = maxSize; } public FixedSizePriorityQueue(int maxSize, Comparator<E> comparator) { super(comparator); this.elementsLeft = maxSize; } /** * @return […]
我在整数Java的优先队列: PriorityQueue<Integer> pq= new PriorityQueue<Integer>(); 当我调用pq.poll()我得到最小的元素。 问题:如何改变代码来获得最大的元素?
Dijkstra的algorithm教给我的如下 while pqueue is not empty: distance, node = pqueue.delete_min() if node has been visited: continue else: mark node as visited if node == target: break for each neighbor of node: pqueue.insert(distance + distance_to_neighbor, neighbor) 但是我一直在做一些关于algorithm的阅读,我看到很多版本使用减less键而不是插入。 这是为什么,这两种方法有什么区别?
在PresentationCore.dll的.NET Framework中,有一个通用的PriorityQueue<T>类,其代码可以在这里find。 我写了一个简短的程序来testingsorting,结果并不是很好: using System; using System.Collections.Generic; using System.Diagnostics; using MS.Internal; namespace ConsoleTest { public static class ConsoleTest { public static void Main() { PriorityQueue<int> values = new PriorityQueue<int>(6, Comparer<int>.Default); Random random = new Random(88); for (int i = 0; i < 6; i++) values.Push(random.Next(0, 10000000)); int lastValue = int.MinValue; int temp; while (values.Count != […]
我正在寻找一个优先级队列或堆数据结构的.NET实现 优先级队列是比简单sorting更灵活的数据结构,因为它们允许新元素以任意间隔进入系统。 将新工作插入优先级队列要比在每次到达时重新sorting所有内容要便宜得多。 基本优先级队列支持三个主要操作: 插入(Q,X)。 给定一个具有密钥k的项目x,将其插入优先级队列Q. 查找-最小(Q)。 返回指向其优先级队列Q中的键值小于其他键的项的指针。 删除 – 最小(Q)。 从优先级队列Q中删除其项最小的项 除非我看错了地方,否则框架中没有一个。 有人知道一个好的,还是应该滚我自己的?
我正在尝试使用PriorityQueue来使用Comparator来sorting对象。 这可以很容易地实现,但对象类variables(比较器计算优先级时)可能会在初始插入后发生变化。 大多数人都提出了简单的解决scheme:删除对象,更新值并重新插入,因为这是优先级队列的比较器投入使用时的情况。 除了在PriorityQueue上创build一个包装类外,还有更好的方法吗?
我如何获得一个PriorityQueuesorting我想要它sorting? 另外, offer和add方法之间有区别吗?