加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【数据结构】优先级队列(一)

发布时间:2020-12-15 06:05:44 所属栏目:安全 来源:网络整理
导读:优先级队列的发明主要是用于删除最大数(最小数) 首先定义一个数组用于实现优先级队列,然后定义一个指针N来控制数组里的最后一个元素。 int[] key;int N; 然后定义构造函数并给数组初始化长度。 Pq(int capacity) {key = new int[capacity];} 然后判空操作

优先级队列的发明主要是用于删除最大数(最小数)

首先定义一个数组用于实现优先级队列,然后定义一个指针N来控制数组里的最后一个元素。

	int[] key;
	int N;

然后定义构造函数并给数组初始化长度。
	Pq(int capacity) {
		key = new int[capacity];
	}

然后判空操作。

	public boolean isEmpty() {
		return N == 0;
	}


然后是交换和比较操作。
	public void exchange(int i,int j) {
		int temp = key[i];
		key[i] = key[j];
		key[j] = temp;
	}

	public boolean more(int v,int w) {
		return v > w;
	}


接下来就是最重要的插入元素操作和删除最大元素操作了。

思路1: 无序插入O(1),删除最大O(N)

插入

	public void insert(int x) {
		key[N++] = x;
	}

删除

	public int deleteMax() {
		if (isEmpty())
			return 0;
		int maxIndex = 0;
		for (int i = 1; i < N; i++) {
			if (more(key[i],key[maxIndex]))
				maxIndex = i;
		}
		exchange(N - 1,maxIndex);
		return key[--N];
	}


思路2:有序插入O(N),删除最大O(1)

尽管可以采取二分查找的思路来寻找插入的位置,但是由于插入元素后,插入元素的后面所有元素都需要向后移动一位,因此时间复杂度依然为O(N)。

插入

	public void insert(int x) {
		if (isEmpty()) {
			key[N++] = x;
			return;
		}
		int left = 0;
		int right = N - 1;
		while (left <= right) {
			int middle = (left + right) / 2;
			if (key[middle] == x) {
				put(middle,x);
				return;
			}
			if (more(key[middle],x))
				right = middle - 1;
			else
				left = middle + 1;
		}
		put(left,x);
	}
	
	public void put(int middle,int x) {
		for (int i = N - 1; i >= middle; i--)
			key[i + 1] = key[i];
		key[middle] = x;
		N++;
	}

删除
	public int deleteMax() {
		if (isEmpty())
			return 0;
		return key[--N];
	}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读