您的位置:首页 > 其它

算法导论学习笔记 6.5 优先队列

2015-03-17 21:43 204 查看
  优先队列(priority queue)是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字(key)。一个最大优先队列支持一下操作:

  INSERT(S, x):把元素x插入集合S中。

  MAXIMUM(S):返回S中具有最大关键字的集合。

  EXTRACT-MAX(S):去掉并返回S中的具有最大关键字的元素。

  INCREASE-KEY(S, x, k):将元素x的关键字值增加到k,这里假设k的值不小于x的原关键字值。

  最大优先队列的应用很多,其中一个就是在共享计算机系统的作业调度。最大优先队列记录将要执行的各个作业以及它们之间的相对优先级。当一个作业完成或者被中断后,调度器选出具有最高优先级的作业来执行。

  显然,优先队列可以用堆来实现。对一个作业调度或事件驱动模拟器这样的应用程序来说,优先队列元素对应着应用程序中的对象。我们需要确定哪个对象对应一个给定的优先队列元素,反之也是。在用堆来实现优先队列时,需要在堆的每个元素里存储对应对象的句柄。同样,在应用程序中,也需要存储一个堆中对应元素的句柄。通常情况下,这一句柄的时数组元素的下标。

  过程HEAP-MAXIMUM可以在O(1)时间内实现MAXIMUM操作(伪代码如下)。  

HEAP-MAXIMUM(A)
1 return A[1]  过程HEAP-EXTRACT-MAX实现EXTRACT-MAX操作。该过程与HEAPSORT过程中的for循环体部分很相似:
HEAP-EXTRACT-MAX(A)
1 if A.heap-size < 1
2 error "heap underflow"
3 max = A[1]
4 A[1] = A[A.heap-size]
5 A.heap-size = A.heap-size - 1
6 MAX-HEAPIFY(A, 1)
7 return max  HEAP-EXTRACT-MAX的时间复杂度为(lgn)。因为除了时间复杂度为O(lgn)的MAX-HEAPIFY已外,其他的操作都是常数阶的。(待续...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论