我在std :: multimap上实现MinMax优先级队列,可能在一个键上有多个值,而且我已经有函数minKey和maxKey用O(1)时间复杂度编写(使用begin()并结束())。
现在,我遇到了实现minValue和maxValue的问题。一个显而易见的解决方案是使用该pqueue的值创建一个数据结构(例如使用std :: set),并在O(1)中访问min和max。
显然,这个解决方案的缺点是重复的内存大小,我当然不想要。
我正在考虑一个分别指向minValue和maxValue的解决方案。插入PQ很容易,只需与这些指针进行比较......现在删除怎么办?
插入:我可以在某个键上有多个值
删除:删除某个键中的任何值(如果键不存在,则抛出异常)。
对于如何在O(1)时间复杂度中实现minValue和maxValue,您有什么建议吗?
提前致谢
答案 0 :(得分:0)
让我们回顾一下你想要的东西。您希望为键值对实现双端优先级队列,必须根据两个不同的比较函数对其进行排序。一个比较对的关键部分,一个比较值部分。
在我看来,单个容器的责任太多了。我建议您实现仅使用单个比较的优先级队列,并使用具有重复内容但具有不同比较功能的两个单独的优先级队列。当然,这与您的并行std::set
想法一样重复数据结构,但是您将实现的更简单的一比较优先级队列通常会更多(重新)有用。即使用户只需要存储简单的非对类型并且不需要多次排序,也可以使用它。如果单个对象的大小很大,那么您可以将指针存储在一个中以节省复制所需的空间。
忽略一个非常不同的解决方案,例如间隔堆,我建议使用std::mutiset
键值对而不是std::multimap
,因为地图不会用于查找任意元素按键。你只需要找到第一个和最后一个元素。
如果您对多比较规则设计感到十分谨慎,那么您可以用来实现队列的是多索引容器。 Boost有一个这样的容器库。