Java 如何实现一个支持add O(1)、remove max O(logn)和remove max O(logn)的集合?

Java 如何实现一个支持add O(1)、remove max O(logn)和remove max O(logn)的集合?,java,performance,time-complexity,complexity-theory,Java,Performance,Time Complexity,Complexity Theory,我需要实现两个集合,它们支持: 用O(1)添加(int),用O(logn)删除_max() 用O(logn)添加(int),用O(1)删除_max() 我做了一些数学运算,计算出如果存在任何集合,我可以用O(log(N!)+O(N))对N个数字进行排序,这与排序的下限O(N*log(N))相矛盾 我错了吗?完全重写第一个案例: 第一种情况——在堆树中保持最小的在顶部排序可能会起作用。我不确定,但如果你从最上面的最小的开始,你可能总能确保在两个孩子中,较大的孩子包含包含最大数量的分支。。然后,当删

我需要实现两个集合,它们支持:

  • 用O(1)添加(int),用O(logn)删除_max()
  • 用O(logn)添加(int),用O(1)删除_max()
  • 我做了一些数学运算,计算出如果存在任何集合,我可以用O(log(N!)+O(N))对N个数字进行排序,这与排序的下限O(N*log(N))相矛盾


    我错了吗?

    完全重写第一个案例:

    第一种情况——在堆树中保持最小的在顶部排序可能会起作用。我不确定,但如果你从最上面的最小的开始,你可能总能确保在两个孩子中,较大的孩子包含包含最大数量的分支。。然后,当删除时,您只需跟随两个孩子中较大的孩子向下递归,直到您碰到一片叶子

    我还没有完全想清楚或者尝试过,但是如果有办法的话,这是我唯一能想象的风格

    第二个基本上是堆的定义。最大的项目总是在树的顶部(这将是O(1)以删除并替换为它的两个子项中的下一个最大项)。添加到它大约是二叉树搜索的速度,因为您必须向下遍历到一个分支,其中父级大于您要添加的值,而子级较小

    嗯,如果它变得不平衡,它将降级为一个链接列表,这将是O(n)…我想关于在树中放置新项目的位置或动态重新平衡的一些技巧是正确的——但是任何树结构都可能变得不平衡并降级为O(n)。

    使用哈希集,这两个操作都有O(1)


    O(1)比O(logn)好,这将通过任何O(logn)测试,因为时间复杂度是一个上限(不是一个特定的时间),所以根据定义O(1)满足O(logn).

    本主题听起来更适合@ErwinBolwidt:算法讨论完全在这里。算法的实现,但op询问是否存在比已知的嵌套复杂度算法具有更好排序复杂度的算法。这不是一个编程问题question@emdshx我们可以,如果你可以补偿内存的速度,如果你做桶排序。我相信堆会给你第二个行为,仍然考虑第一个。堆不支持用O(1)删除max/min,你需要用swift down/up修复堆,这需要O(logn)他没有要求最小,只有马克斯——但我可能遗漏了什么。@Gox我想你是对的。我试图弄清楚它是否能在你构建它的过程中得到平衡(尽可能多)(左边的东西总是比右边的东西大,或者像这样奇怪的东西),但是我无法在不编码的情况下完成细节。是的,这不起作用——但如果有解决方案,它必须是这样的。好的,编辑你的答案,这样我就可以删除我的答案好的:)我没有想到itA HashSet对RemoveMax不起作用。不幸的是,删除最大值需要用O(n)重新扫描整个集合,以找出下一个最大值