如何实现支持加O(1),移除最大O(logn)以及反之亦然的集合?

时间:2019-04-12 21:47:41

标签: java performance time-complexity complexity-theory

我需要实现两个支持以下功能的集合:

  1. 使用O(1)添加(int)和使用O(登录)删除Remove_max()
  2. 使用O(logn)添加(int)和使用O(1)删除Remove_max()

我做了一些数学运算,发现如果存在任何集合,我可以使用O(log(n!)+ O(N))对N个数字进行排序,这与排序的下限O(N * log( N))。

我错了吗?

2 个答案:

答案 0 :(得分:2)

完全重写第一种情况:

第一种情况-可能会保留在堆树中,顶部最小的堆排序。我不确定,但是如果您从顶部的最低位置开始,您也许可以始终确保两个孩子中较大的孩子包含了包含最大数字的分支。然后删除时,您只需要沿着两个孩子中的较大者向下递归,直到碰到一片叶子为止。

我还没有完全考虑或尝试过,但是如果有办法,这是我能想象的唯一样式。

第二个几乎是堆的定义。最大的项始终位于树的顶部(将O(1)删除并替换为树中的第二个最大子项)。加上它与二叉树搜索的速度有关,因为您必须遍历到父级大于要添加的值而子级较小的分支。...

嗯,如果它不平衡,它将降级为一个链表,该链表将是O(n)…我想一些聪明的事可以使您在树中放置新项目,或者动态重新平衡是有序的-但是任何树结构会变得不平衡并退化为O(n)。

答案 1 :(得分:2)

使用HashSet,这两个操作都具有O(1)。

O(1)优于O(log n),这将通过O(log n)的任何测试,因为时间复杂度是上限的上限(而不是特定时间),因此根据定义,O(1)满足O(log n)。