Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有支持快速插入和中值计算的数据结构?_Java_Algorithm_Optimization_Data Structures - Fatal编程技术网

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的大小

我需要一个支持以下操作的数据结构:

  • 插入一个数字
  • 找出所有插入数字的中位数
  • (附加)找到所有插入数字的已知提前分位数(0-1) 最简单的方法是在每次插入后对数字进行排序,但这并不快。有更快的解决方案吗?

    您可以使用两个二进制堆在O(logN)中执行操作(1)和(2)在O(1)中执行操作(也许您也可以快速执行操作(3),我只是不太精通概率论)

    创建最大堆
    L
    和最小堆
    R
    。创建两个变量
    a
    b
    ,它们将存储一个(或两个)中间元素。堆
    L
    将存储小于中间元素的所有元素,堆
    R
    将存储大于中间元素的所有元素。
    L
    R
    的大小将始终相同

    插入(
    x
    ):

    • 如果数据结构中的元素计数为奇数(
      a
      存储中间元素,
      b
      不存储任何内容):
      • 如果
        x
        • b=a
        • a=x
      • 如果
        x>=a
        • b=x
    • 如果数据结构中的元素计数为偶数(
      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,
        TreeSet
        不支持通过索引直接访问,因此在这种情况下获取中值并不快。@Abra,链接的问题就是我需要的。非常感谢。有帮助吗?