我有一个集合,尚不知道要使用哪种数据结构。 我有两个功能,添加和删除。
这两个功能都需要具有相似的复杂性,因为它们都是经常使用的。
要么是加函数,要么简单为O(1),而removeMax
将是O(log n)或均为o(1)或其中之一为log n和其他o(n)。
removeMax
应该删除该最大值并返回它,并且应该能够多次使用,因此,下次您调用它时,它将删除下一个新的最大值。
是否有一种方法可以同时处理O(1)或至少要删除的日志n?
答案 0 :(得分:4)
如果是排序结构(例如TreeSet
),则add
和remove
都需要O(logN)
。
如果未排序,则add
可以在O(1)
中实现,但是removeMax
将花费O(N)
,因为您必须检查所有元素才能找到未排序的最大值数据结构。
答案 1 :(得分:0)
Max heaps可能正是您想要的,删除操作的摊销复杂度为O(logn)。 Fibonacci heap(请参阅此great animation,以了解其工作原理)看起来像适合您的数据结构,因为它具有用于 insert 和所有其他操作的O(1)。不幸的是,它的实现不是标准Java库的一部分,但是有很多实现(例如,请参见@Lino注释中的answer)。
答案 2 :(得分:0)
如果您需要一个数据结构来同时执行O(logn)中的add()和removeMax(),则只需要一个排序数组即可。对于removeMax()和add(),都可以使用二进制搜索来找到目标值。 (对于remove,找到最大值。对于add,找到小于要插入的最大值,然后在其后插入值)。两者的时间复杂度均为O(logn)。