在O(1)中使用minValue和maxValue实现MinMax PriorityQueue

时间:2015-12-23 12:54:45

标签: c++ priority-queue multimap minmax

我在std :: multimap上实现MinMax优先级队列,可能在一个键上有多个值,而且我已经有函数minKey和maxKey用O(1)时间复杂度编写(使用begin()并结束())。

现在,我遇到了实现minValue和maxValue的问题。一个显而易见的解决方案是使用该pqueue的值创建一个数据结构(例如使用std :: set),并在O(1)中访问min和max。

显然,这个解决方案的缺点是重复的内存大小,我当然不想要。

我正在考虑一个分别指向minValue和maxValue的解决方案。插入PQ很容易,只需与这些指针进行比较......现在删除怎么办?

插入:我可以在某个键上有多个值

删除:删除某个键中的任何值(如果键不存在,则抛出异常)。

对于如何在O(1)时间复杂度中实现minValue和maxValue,您有什么建议吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

让我们回顾一下你想要的东西。您希望为键值对实现双端优先级队列,必须根据两个不同的比较函数对其进行排序。一个比较对的关键部分,一个比较值部分。

在我看来,单个容器的责任太多了。我建议您实现仅使用单个比较的优先级队列,并使用具有重复内容但具有不同比较功能的两个单独的优先级队列。当然,这与您的并行std::set想法一样重复数据结构,但是您将实现的更简单的一比较优先级队列通常会更多(重新)有用。即使用户只需要存储简单的非对类型并且不需要多次排序,也可以使用它。如果单个对象的大小很大,那么您可以将指针存储在一个中以节省复制所需的空间。

忽略一个非常不同的解决方案,例如间隔堆,我建议使用std::mutiset键值对而不是std::multimap,因为地图不会用于查找任意元素按键。你只需要找到第一个和最后一个元素。

如果您对多比较规则设计感到十分谨慎,那么您可以用来实现队列的是多索引容器。 Boost有一个这样的容器库。