优先队列
2018-03-14 15:31
148 查看
接着上一篇,是利用堆这种数据结构去实现优先队列。
优先队列(priority queue)是一种用来维护一组元素组成的集合S的数据结构,其中每一个元素都有一个相关的的值,称为关键字(key)。最大优先队列支持以下操作:insert(S, x):将元素x插入到S中;
maximum(S):返回S中具有最大key的元素;
extractMax(S):去掉并返回S中具有最大key的元素;
increaseKey(S, x, k):将元素x的key值增加到k(k不能小于原key值);
以下直接给出四个操作参考代码,我在代码中相应的做出了一些解释。一、private static void Insert(int[] a, int key) {
// 插入一个数
int heap_size = a.length;
heap_size = heap_size + 1; // 堆中的顺序改变了, 但是原数组的长度没有改变, 动态改变数组长度以存放这个元素
int [] b = new int[heap_size];
System.arraycopy(a, 0, b, 0, heap_size - 1);//a中的元素赋给b
b[heap_size - 1] = Integer.MIN_VALUE;//先给新增的位置赋值,设置为无穷小
Increase_key(b, heap_size - 1, key);
System.out.println(Arrays.toString(b));
}二、private static int Heap_maximum(int[] a) {//返回最大键字的元素
int size = a.length;
Build_MAXheap(a, size);
return a[0];
}三、
参考:《算法导论》
以上就是该篇文章的内容,如果存在错误或者有什么可以改进的地方,请您指出,谢谢!
优先队列(priority queue)是一种用来维护一组元素组成的集合S的数据结构,其中每一个元素都有一个相关的的值,称为关键字(key)。最大优先队列支持以下操作:insert(S, x):将元素x插入到S中;
maximum(S):返回S中具有最大key的元素;
extractMax(S):去掉并返回S中具有最大key的元素;
increaseKey(S, x, k):将元素x的key值增加到k(k不能小于原key值);
以下直接给出四个操作参考代码,我在代码中相应的做出了一些解释。一、private static void Insert(int[] a, int key) {
// 插入一个数
int heap_size = a.length;
heap_size = heap_size + 1; // 堆中的顺序改变了, 但是原数组的长度没有改变, 动态改变数组长度以存放这个元素
int [] b = new int[heap_size];
System.arraycopy(a, 0, b, 0, heap_size - 1);//a中的元素赋给b
b[heap_size - 1] = Integer.MIN_VALUE;//先给新增的位置赋值,设置为无穷小
Increase_key(b, heap_size - 1, key);
System.out.println(Arrays.toString(b));
}二、private static int Heap_maximum(int[] a) {//返回最大键字的元素
int size = a.length;
Build_MAXheap(a, size);
return a[0];
}三、
private static int Extract_max(int[] a) { //去掉 并 返回 该集合中具有最大值键的元素 int heap_size = a.length - 1; int maximum = a[0]; a[0] = a[heap_size]; heap_size --; MAX_heapify(a, 0, heap_size); return maximum; }四、
private static void Increase_key(int[] a, int i, int key) { // 将i表示对应的值增加到 key, 这里假设key的值不小于i 的原关键字值 a[i] 更新新的值 if(key < a[i]){ System.out.println("不符合条件!"); } a[i] = key; while(i > 0 && a[(i - 1) / 2] < a[i]){//parent(i) = (i - 1) / 2 int temp = a[i]; a[i] = a[(i - 1) / 2]; a[(i - 1)/ 2] = temp; i = i / 2; } }在以上的操作中,需要使用两个其他的方法:MAX_heapify(a, i, heap_size) 和 Build_MAXheap(a, size)。可参看我的另一篇文章:点击打开链接。测试代码和截图:
public static void main(String[] args) { int [] a = {15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1}; System.out.println(Heap_maximum(a)); System.out.println(Extract_max(a)); System.out.println(Arrays.toString(a));//测试删除后的数组 int i = 6, key = 18; Increase_key(a, i, key); System.out.println(Arrays.toString(a)); int key1 = 20; Insert(a, key1); }
参考:《算法导论》
以上就是该篇文章的内容,如果存在错误或者有什么可以改进的地方,请您指出,谢谢!
相关文章推荐
- 优先队列
- 优先队列(堆) - C语言实现(摘自数据结构与算法分析 C语言描述)
- poj 3253 Fence Repair (优先队列)
- NYOJ 55 懒省事的小明(优先队列)
- POJ 2431 Expedition (贪心+优先队列)
- 《数据结构》C++代码 堆(优先队列)
- priority_queue的用法(优先队列)
- CSU 1350 To Add Which? 给序列增加最少的值使得相邻数差<=D 优先队列+贪心
- HDOJ 题目4857 逃生(逆序拓扑排序,优先队列)
- 优先队列的使用
- HDU2425:Hiking Trip(简单bfs,优先队列实现)
- Sunscreen (poj 3614 贪心+优先队列)
- NYOJ 1107 最高的奖励(贪心+优先队列)
- 挑战程序设计竞赛 二叉堆(优先队列)的实现
- HDU 1026 Ignatius and the Princess I(优先队列+打印路径)
- HDU 4006 The kth great number(优先队列)
- TL 栈,队列,优先队列用法
- Dijkstra(优先队列)
- 【优先队列+贪心】POJ2431-Expedition
- UVA11997 K Smallest Sums(并归,优先队列)