跳到主要内容

简述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 类有两个堆,maxHeapminHeapaddNum 方法用于向数据流中添加元素,同时维护两个堆的平衡。findMedian 方法返回当前的中位数。

注意,这个示例假设数据流中的元素是整数。如果元素是其他类型,你需要相应地调整堆的声明和比较逻辑。