代码之家  ›  专栏  ›  技术社区  ›  SiLent SoNG

从整数流中求中值[闭合]

  •  18
  • SiLent SoNG  · 技术社区  · 16 年前

    给定一个未排序的整数序列作为流流入程序。

    整数太多,无法放入内存。

    假设有一个函数:

    int getNext() throws NoSuchElementException;
    

    它返回流中的下一个整数。

    在O(n)中解决问题。

    有什么想法吗?

    给出提示(使用堆数据结构..)

    4 回复  |  直到 16 年前
        1
  •  2
  •   Svante    16 年前

    看到这个了吗 paper . 很可能不止一次。其思想是,在每一个过程的上限和下限的计算,使中位数之间的谎言。

    一个基本的结果是 不 =数据大小, 第 =通过次数

    定理2)A -选择 K公司 第 不 元素需要 最多存储 O(无) ( 1 / ) (对数N) 2 第 ) .

    另外,对于极少量的存储 S码 ,即 2 ) ,有一类选择算法 最多 O((对数N) 3/秒 通行证。

    看报纸。我真的不知道这堆东西跟它有什么关系

        2
  •  10
  •   Tanuj    16 年前

    您必须维护两个堆一个max heap(它包含到目前为止看到的最小的N/2个元素)和一个min heap(它包含最大的N/2个元素)。如果N是奇数,则将多余的元素存储在一边。

    如果N变为奇数,则将新元素另存为额外元素。如有必要,将该元素与最小堆或最大堆中的元素交换,以满足以下条件

    如果N变为偶数,则按上述方法获得第二个额外元素。然后,将较小的一个添加到max堆,将较大的一个添加到min堆。 插入应为O(log N)

    获取中值:O(1)
    如果N是奇数,则中位数是额外的元素。

        3
  •  0
  •   willawill    14 年前

    假设中间带保持的窗口是K。 按顺序遍历并找到第(K/2)个元素O(K/2);

    总时间为O(K)。

        4
  •  0
  •   Pavan Dittakavi    14 年前

    使用选择算法,我们可以在O(n)复杂度下实现这一点。但我仍然不清楚堆在这种情况下的用法。