优先队列(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已外,其他的操作都是常数阶的。(待续...)
时间: 2024-10-05 05:48:25