如何从具有“ O(log n)” _时间复杂度的集合中删除最大值?

时间:2019-03-26 08:44:16

标签: java collections time-complexity

我有一个集合,尚不知道要使用哪种数据结构。 我有两个功能,添加和删除。

这两个功能都需要具有相似的复杂性,因为它们都是经常使用的。

要么是加函数,要么简单为O(1),而removeMax将是O(log n)或均为o(1)或其中之一为log n和其他o(n)。

removeMax应该删除该最大值并返回它,并且应该能够多次使用,因此,下次您调用它时,它将删除下一个新的最大值。

是否有一种方法可以同时处理O(1)或至少要删除的日志n?

3 个答案:

答案 0 :(得分:4)

如果是排序结构(例如TreeSet),则addremove都需要O(logN)

如果未排序,则add可以在O(1)中实现,但是removeMax将花费O(N),因为您必须检查所有元素才能找到未排序的最大值数据结构。

答案 1 :(得分:0)

Max heaps可能正是您想要的,删除操作的摊销复杂度为O(logn)。 Fibonacci heap(请参阅此great animation,以了解其工作原理)看起来像适合您的数据结构,因为它具有用于 insert 和所有其他操作的O(1)。不幸的是,它的实现不是标准Java库的一部分,但是有很多实现(例如,请参见@Lino注释中的answer)。

Guava's implementation of min-max heap

答案 2 :(得分:0)

如果您需要一个数据结构来同时执行O(logn)中的add()和removeMax(),则只需要一个排序数组即可。对于removeMax()和add(),都可以使用二进制搜索来找到目标值。 (对于remove,找到最大值。对于add,找到小于要插入的最大值,然后在其后插入值)。两者的时间复杂度均为O(logn)。