如何实现支持添加O(1)的集合,删除max O(logn),反之亦然? [关闭]

问题描述 投票:5回答:2

我需要实现2个支持的集合:

  1. 使用O(1)添加(int),使用O(logn)添加Remove_max()
  2. 使用O(logn)添加(int),使用O(1)添加Remove_max()

我做了一些数学计算,并认为如果任何集合存在,我可以用O(log(n!)+ O(N))对N个数字进行排序,这与排序的下限相矛盾,即O(N * log(N)) 。

我错了吗?

java performance time-complexity complexity-theory
2个回答
2
投票

完全重写第一个案例:

第一种情况 - 它可能会保留在堆树中,并按照顶部的SMALLEST进行排序。我不确定,但是如果你开始使用最低的顶部,你可以始终确保两个孩子中的那个,较大的孩子包含包含最大数字的分支..然后在移除时你只需要跟着两个孩子中较大的孩子一起递减,直到你击中一片叶子。

我没有完全考虑到这一点或尝试过,但如果有办法,这是我能想象的唯一风格。

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

嗯,如果它变得不平衡,它会降级为一个链接列表,这将是O(n)...我想一些关于你在树中放置新项目或动态重新平衡的一些智能将是有序的 - 但任何树结构都可能变得不平衡并降解为O(n)。


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.