微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有效地找到随机序列的中值

如何解决有效地找到随机序列的中值

| 数字是随机生成的,并传递给方法。编写程序以在生成新值时查找并维护中间值。 堆大小可以相等,或者下面的堆多一个
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。
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
谢谢     

解决方法

按照给定的顺序运行之后,
max-heap : 1,2,3
min-heap : 4,5
由于最大堆大小>最小堆大小,因此返回3作为中位数。 max-heap大约存储元素的左半部分,min-heap大约存储序列的右半部分。 此代码偏向于max-heap的左半部分。 我看不出为什么此代码不正确。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。