首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效地求出随机序列的中值

有效地求出随机序列的中值
EN

Stack Overflow用户
提问于 2011-04-15 04:32:46
回答 1查看 2.5K关注 0票数 1

数字是随机生成的,并传递给一个方法。编写一个程序,在生成新值时查找和维护中位数。

堆的大小可以相等,或者下面的堆有一个额外的大小。

代码语言:javascript
复制
private Comparator<Integer> maxHeapComparator, minHeapComparator;
private PriorityQueue<Integer> maxHeap, minHeap;

public void addNewNumber(int randomNumber) {
  if (maxHeap.size() == minHeap.size()) {
    if ((minHeap.peek() != null) && randomNumber > minHeap.peek()) {
      maxHeap.offer(minHeap.poll());
      minHeap.offer(randomNumber);
    } else {
      maxHeap.offer(randomNumber);
    }
  }
  else {  // why the following block is correct? 
    // I think it may create unbalanced heap size
    if(randomNumber < maxHeap.peek()) {
      minHeap.offer(maxHeap.poll());
      maxHeap.offer(randomNumber);
    }
    else {
      minHeap.offer(randomNumber);
    }
  }
}

public static double getMedian() {
  if (maxHeap.isEmpty()) return minHeap.peek();
  else if (minHeap.isEmpty()) return maxHeap.peek();

  if (maxHeap.size() == minHeap.size()) {
    return (minHeap.peek() + maxHeap.peek()) / 2;
  } else if (maxHeap.size() > minHeap.size()) {
    return maxHeap.peek();
  } else {
    return minHeap.peek();
  }
}

假设解决方案是正确的,那么我就不明白为什么代码块(参见我的注释)可以保持堆大小平衡。换句话说,两个堆的大小之差是0或1。

代码语言:javascript
复制
Let us see an example, given a sequence 1, 2, 3, 4, 5
The first random number is **1**
    max-heap: 1
    min-heap:

The second random number is **2**
    max-heap: 1
    min-heap: 2

The third random number is **3**
    max-heap: 1 2
    min-heap: 3 4

The fourth random number is **4**
    max-heap: 1 2 3
    min-heap: 4 5

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-15 04:49:45

在通过给定的序列运行它之后,

代码语言:javascript
复制
max-heap : 1, 2, 3
min-heap : 4, 5

因为max-heap大小大于min-heap,所以它返回3作为中间值。

max-heap大约存储左半个元素,min-heap大约存储右半个序列。

这段代码偏向于最大堆的左半部分。

我不明白为什么这个代码是不正确的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5669316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档