java 使用优先级队列管理元素中值的数据结构的Java实现(在O(1)中查看,在O(logN)中插入/删除)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 使用优先级队列管理元素中值的数据结构的Java实现(在O(1)中查看,在O(logN)中插入/删除)相关的知识,希望对你有一定的参考价值。

import java.util.*;

public class MedianManager<T extends Number & Comparable<T>> {

	private PriorityQueue<T> maxPQ;
	private PriorityQueue<T> minPQ;

	public MedianManager() {
		maxPQ = new PriorityQueue<T>((T e1, T e2) -> -e1.compareTo(e2));
		minPQ = new PriorityQueue<T>((T e1, T e2) -> e1.compareTo(e2));
	}

	public void insert(T element) {
		if (maxPQ.size() == 0) {
			maxPQ.add(element);
		}
		else if (maxPQ.size() > minPQ.size()){
			assert(maxPQ.size() - minPQ.size() == 1);
			if (!isLessThan(element, maxPQ.peek())) {
				minPQ.add(element);
			}
			else {
				maxPQ.add(element);
				minPQ.add(maxPQ.poll());
			}
			assert(maxPQ.size() == minPQ.size());
		}
		else {
			assert(maxPQ.size() == minPQ.size());
			if (!isGreaterThan(element, maxPQ.peek())) {
				maxPQ.add(element);
			}
			else {
				minPQ.add(element);
				maxPQ.add(minPQ.poll());
			}
			assert(maxPQ.size() - minPQ.size() == 1);
		}
	}

	public double peekMedian() {
		if (isEmpty()) {
			throw new RuntimeException("trying to peek while there are no elements");
		}

		if (maxPQ.size() > minPQ.size()) {
			return maxPQ.peek().doubleValue();
		}
		else {
			return (maxPQ.peek().doubleValue() + minPQ.peek().doubleValue()) / 2;
		}
	}

	public double removeMedian() {
		if (isEmpty()) {
			throw new RuntimeException("trying to remove while there are no elements");
		}

		if (maxPQ.size() > minPQ.size()) {
			return maxPQ.poll().doubleValue();
		}
		else {
			return (maxPQ.poll().doubleValue() + minPQ.poll().doubleValue()) / 2;
		}
	}

	public boolean isEmpty() {
		return maxPQ.isEmpty() && minPQ.isEmpty();
	}

	private boolean isGreaterThan(T a, T b) {
		return a.compareTo(b) > 0;
	}

	private boolean isLessThan(T a, T b) {
		return a.compareTo(b) < 0;
	}

	// sample test code below

	public static void main(String[] args) {
		MedianManager<Integer> median = new MedianManager<>();
		median.insert(1);
		System.out.println(median.peekMedian());
		median.insert(2);
		System.out.println(median.peekMedian());
		median.insert(3);
		System.out.println(median.peekMedian());
		median.insert(4);
		System.out.println(median.peekMedian());
		median.insert(5);
		System.out.println(median.removeMedian());
		System.out.println(median.removeMedian());
		System.out.println(median.removeMedian());
	}

}

以上是关于java 使用优先级队列管理元素中值的数据结构的Java实现(在O(1)中查看,在O(logN)中插入/删除)的主要内容,如果未能解决你的问题,请参考以下文章

初识java集合——队列

Java数据结构之优先级队列

matlab图像处理-中值滤波原理

matlab图像处理-中值滤波原理

中值滤波与图像锐化

Java之优先队列