【发布时间】:2011-08-22 16:51:13
【问题描述】:
如何配置std::priority_queue 以忽略重复项?
当我添加一个已经包含的密钥时,应该忽略这个新的。 (在我的情况下,旧的和新的优先级总是完全相同的。)
在复杂性方面它不应该有所作为:它会尝试在适当的位置插入,在那里找到现有的并且什么都不做。问题是std::priority_queue 是否可以通过这种方式进行配置。
【问题讨论】:
-
我认为堆不支持在 O(log N) 中“找到现有的”。
-
@KennyTM,幸运的是,pqueue 不必是堆;-)
-
@KennyTM:要找到现有的(注意:与新的优先级相同),我们首先在 O(log N) 时间内找到插入位置,然后识别该位置的现有键(二进制搜索在 O(log N)) 中。或者我错过了什么?
-
您错过了 std::priority_queue 可能实现为最大堆二叉树的事实,它对于任何值都没有固定的“适当的插入位置”。新值被插入到最后,然后渗透到所有子元素都具有较低值的第一个位置。多次插入具有相同优先级的键可能最终会出现在树的完全不同的分支中。
标签: c++ stl heap priority-queue