Java 是否有支持快速插入和中值计算的数据结构?
我需要一个支持以下操作的数据结构:Java 是否有支持快速插入和中值计算的数据结构?,java,algorithm,optimization,data-structures,Java,Algorithm,Optimization,Data Structures,我需要一个支持以下操作的数据结构: 插入一个数字 找出所有插入数字的中位数 (附加)找到所有插入数字的已知提前分位数(0-1) 最简单的方法是在每次插入后对数字进行排序,但这并不快。有更快的解决方案吗?您可以使用两个二进制堆在O(logN)中执行操作(1)和(2)在O(1)中执行操作(也许您也可以快速执行操作(3),我只是不太精通概率论) 创建最大堆L和最小堆R。创建两个变量a和b,它们将存储一个(或两个)中间元素。堆L将存储小于中间元素的所有元素,堆R将存储大于中间元素的所有元素。L和R的大小
L
和最小堆R
。创建两个变量a
和b
,它们将存储一个(或两个)中间元素。堆L
将存储小于中间元素的所有元素,堆R
将存储大于中间元素的所有元素。L
和R
的大小将始终相同
插入(x
):
- 如果数据结构中的元素计数为奇数(
存储中间元素,a
不存储任何内容):b
- 如果数据结构中的元素计数为偶数(
和a
存储两个中间元素):b
- 如果
:x
- 将
放入b
R
- 将
放入x
L
b=null
- 将
- 如果
:x>b
- 将
放入x
R
- 将
放入a
L
a=b
b=null
- 将
- 如果
a一个平衡的二叉搜索树可以用每个节点上的子树的大小来扩充。在树旋转期间,保持此统计是恒定的时间,您可以使用它来查找任意i值的O(logn)中的第i个元素:
:向左递归i
:返回当前节点i==size(左)
:设置i>size(左)
并向右递归i=i-size(左)-1
这样的数据结构在所有三个操作上都会给出O(logn)边界。好吧,如果您最初知道数组的内容开始排序,您可以使用此属性进行二进制搜索,以查找键是否存在,如果不存在,则应将其插入何处。然后,您可以在该点插入值,数据将继续保持“排序”。是的,这有点老派,但会很有效。因为您必须查看所有插入的数字才能解出2和3,所以一个列表就足够了。您看到这个问题了吗@Abra,
不支持通过索引直接访问,因此在这种情况下获取中值并不快。@Abra,链接的问题就是我需要的。非常感谢。有帮助吗?TreeSet
- 如果