我正在使用优先级队列,该队列最初将其元素的优先级基于启发式算法.当元素出列时,启发式更新,并且队列中当前的元素可能会增加其键.
我知道有堆(特别是Fibonacci堆)已经摊销O(1)减少了关键操作,但是有没有任何堆结构在增加键操作上有类似的界限?
对于我的应用程序来说,这远远不是一个性能问题(二进制堆工作正常)它真的只是学术上的好奇心.
编辑:澄清一下,我正在寻找一个数据结构,它具有比O(logn)时间更快的增加键操作,而不是减少键.我的应用程序永远不会减少密钥,因为启发式过度估计优先级.
对于不一致支持优先级消息(如AMQP)的面向消息的中间件,当队列只有FIFO语义时,实现优先级消耗的最佳方法是什么?一般用例是一种系统,其中当队列中存在大量积压的消息时,消费者在较低优先级的消息之前接收具有较高优先级的消息.
有没有人知道基于数据库的优先级队列实现?
我正在处理大量数据,因此将其全部保存在内存中是不可行的.
谢谢!
我尝试用std :: priority_queue替换std :: multiset。但是我对速度结果感到失望。该算法的运行时间增加了50%...
以下是相应的命令:
top() = begin();
pop() = erase(knn.begin());
push() = insert();
Run Code Online (Sandbox Code Playgroud)
我对priority_queue实现的速度感到惊讶,我预期会有不同的结果(对于PQ更好)...从概念上讲,多集被用作优先级队列。为什么优先级队列和多重集即使在情况下也具有如此不同的性能-O2?
十个结果的平均值,MSVS 2010,Win XP,32位,方法findAllKNN2()(请参见下面的内容)
MS
N time [s]
100 000 0.5
1 000 000 8
PQ
N time [s]
100 000 0.8
1 000 000 12
Run Code Online (Sandbox Code Playgroud)
什么会导致这些结果?尚未对源代码进行其他更改...感谢您的帮助...
MS实施:
template <typename Point>
struct TKDNodePriority
{
KDNode <Point> *node;
typename Point::Type priority;
TKDNodePriority() : node ( NULL ), priority ( 0 ) {}
TKDNodePriority ( KDNode <Point> *node_, typename Point::Type priority_ ) : node ( …Run Code Online (Sandbox Code Playgroud) 我们使用Redmine来记录和跟踪我们的所有任务,错误和功能.我们有一个月的发布周期,确保Redmine中项目的顺序与每个项目的相对优先级相对应是很重要的,这样人们就不会处理不那么重要的事情了.
目前为了实现这一目标,我们在Redmine中创建了一个名为"rank"的自定义字段,并为每个项目分配了1-1000的整数.这最初工作,但重新排序项目和重新排序只是痛苦,因为相同的项目最终被编辑多次,以使其在优先级列表上的正确位置.有没有办法能够拖放项目来重新排序?我怀疑我们有一个独特的要求,其他人必须有某种方式这样做?
马克斯,感谢您的帮助
memory-management project priority-queue redmine redmine-plugins
使用stl,priority_queue您可以设置基础容器,例如a vector.为stl指定容器有哪些优点priority_queue?
我正在比较STL(g ++)priority_queue的性能,发现push和pop没有我想象的那么快.请参阅以下代码:
#include <set>
#include <queue>
using namespace std;
typedef multiset<int> IntSet;
void testMap()
{
srand( 0 );
IntSet iSet;
for ( size_t i = 0; i < 1000; ++i )
{
iSet.insert(rand());
}
for ( size_t i = 0; i < 100000; ++i )
{
int v = *(iSet.begin());
iSet.erase( iSet.begin() );
v = rand();
iSet.insert(v);
}
}
typedef priority_queue<int> IntQueue;
void testPriorityQueue()
{
srand(0);
IntQueue q;
for ( size_t i = 0; i < 1000; ++i )
{ …Run Code Online (Sandbox Code Playgroud) Java文档指定
Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.
我试图理解为什么?11的优点是什么?
我试着Maximum Waiting Time进入我的内心PQueue.这 Maximum Waiting Time将PQueue自动检查我是否有任何links等待Maximum Waiting Time删除它.我对我的代码进行了这项更改,但它在删除链接后正好停止了.我想PQueue根据等待时间条件删除我的所有元素.你能告诉我这里缺少什么吗?
这是我的班级:
public class MyClass {
public static PriorityQueue <LinkNodeLight> PQueue = new PriorityQueue <> ();
private static Set<String> DuplicationLinksHub = new LinkedHashSet <> ();
private static Integer IntraLinkCount = new Integer (0);
private static Integer InterLinkCount = new Integer (0);
private static Integer DuplicationLinksCount = new Integer (0);
private static Integer MaxWaitTime = new Integer (60000); // 1 M= …Run Code Online (Sandbox Code Playgroud) 使用最小/最大堆算法时,优先级可能会发生变化.处理此问题的一种方法是删除并插入元素以更新队列顺序.
对于使用数组实现的优先级队列,这可能是一个似乎可以避免的性能瓶颈,特别是对于优先级变化较小的情况.
即使这不是优先级队列的标准操作,这也是一个可以根据我的需要进行修改的自定义实现.
是否有众所周知的最佳实践方法来更新min/max-heap中的元素?
背景信息:我不是二叉树专家,我继承了一些代码,这些代码在优先级队列中重新插入了元素.我为重新排序新元素的min-heap做了一个重新插入函数 - 这给了一个可测量的改进(删除和插入),但这似乎是其他人可能已经解决的更优雅的问题办法.
我可以链接到代码,如果它有所帮助,但宁愿不太关注实现细节 - 因为这个Q&A可能保持一般.