【发布时间】:2017-01-23 13:38:43
【问题描述】:
我实现了一个使用优先级队列的算法。 我被这个问题所激励: Transform a std::multimap into std::priority_queue
我将存储多达 1000 万个元素及其特定的优先级值。
然后我想迭代直到队列为空。 每次检索一个元素时,它也会从队列中删除。
在此之后我重新计算元素的优先级值,因为之前的迭代它可以改变。
如果该值确实增加了,我会将元素再次插入队列中。 这种情况更经常发生,取决于进度。 (前 25% 不会发生,接下来的 50% 会发生,最后 25% 会发生多次)。
在收到下一个元素并且不重新插入后,我将对其进行处理。因为我不需要这个元素的优先级值,而是这个元素的技术 ID。
这就是我直觉选择std::multimap 来实现这一点的原因,使用.begin() 获取第一个元素,.insert() 插入它,.erase() 删除它。
另外,我没有直观地直接选择std::priority_queue,因为该主题的其他问题回答std::priority_queue 很可能仅用于单个值而不是映射值。
在阅读了上面的链接后,我使用优先级队列来重新实现它,类似于链接中的另一个问题。
我的运行时间似乎并没有那么不平等(10 个 mio 元素大约需要一个小时)。
现在我想知道为什么std::priority_queue 更快。
实际上我希望std::multimap 更快,因为有很多重新插入。
也许问题是多图的重组太多?
【问题讨论】:
-
我无法理解您的算法。优先级队列和多图在语义上完全不同。一种是排序的关联容器,它可以为同一个键保存多个项目。它必须通过密钥提供相当快速的查找。另一个本质上是一个
int, T对容器,旨在选择极端int。它的约束较少。我希望它会更快。您在多图中的键是否像链接问题中的队列优先级?我猜对了吗? -
是的,在 multimap 中,键是特定元素的优先级值,优先级值可以(并且确实)出现多次。如果一个优先级值确实存在多次,那么首先选择“组”中的哪个元素并不重要。
标签: c++ std priority-queue multimap