您的位置:首页 > 编程语言 > Java开发

优先队列

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];
}三、
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);
}




参考:《算法导论》

以上就是该篇文章的内容,如果存在错误或者有什么可以改进的地方,请您指出,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法 优先队列