简述Java如何找出数据流中的中位数 ?
参考答案:
在Java中找出数据流中的中位数,你可以使用两个堆数据结构,一个最大堆(MaxHeap)和一个最小堆(MinHeap)。最大堆用于存储数据流中的较小的一半元素,而最小堆用于存储较大的一半元素。通过这种方式,你可以确保两个堆的大小之差不超过1,从而轻松地找到中位数。
以下是一个简单的示例代码,演示如何使用两个堆来找到数据流中的中位数:
import java.util.PriorityQueue;
import java.util.Comparator;
public class MedianFinder {
private PriorityQueue<Integer> maxHeap; // 存储较小一半的元素
private PriorityQueue<Integer> minHeap; // 存储较大一半的元素
public MedianFinder() {
maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
minHeap = new PriorityQueue<>();
}
public void addNum(int num) {
if (maxHeap.isEmpty() || num <= maxHeap.peek()) {
maxHeap.offer(num);
} else {
minHeap.offer(num);
}
// 平衡两个堆的大小
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.offer(maxHeap.poll());
} else if (minHeap.size() > maxHeap.size()) {
maxHeap.offer(minHeap.poll());
}
}
public double findMedian() {
if (maxHeap.size() == minHeap.size()) {
return (maxHeap.peek() + minHeap.peek()) / 2.0;
} else {
return maxHeap.peek();
}
}
public static void main(String[] args) {
MedianFinder finder = new MedianFinder();
finder.addNum(1);
finder.addNum(2);
System.out.println(finder.findMedian()); // 输出 1.5
finder.addNum(3);
System.out.println(finder.findMedian()); // 输出 2
}
}
在这个示例中,MedianFinder
类有两个堆,maxHeap
和 minHeap
。addNum
方法用于向数据流中添加元素,同时维护两个堆的平衡。findMedian
方法返回当前的中位数。
注意,这个示例假设数据流中的元素是整数。如果元素是其他类型,你需要相应地调整堆的声明和比较逻辑。