优先队列实现机制
优先队列实现机制主要有以下两种:
- Heap(Binary,Binomial,Fibonacci)
- Binary Search Tree
Heap有很多种实现形式,之前学习的小顶堆和大顶堆是二叉堆,不同结构的堆在实现同样的需求时所需时间复杂度也是不同的,具体如下图所示:
注:Binominal:多项式堆;Fibonacci:斐波那契堆;Strict Fibonacci:严格斐波那契堆
从上表可以看出,二叉堆的性能一般都比较差,除了找到最值和其他类型的堆都是O(1)外,其他操作的时间复杂度明显不占优。而斐波那契堆和严格斐波那契堆是效率最好的类型。
在Python和Java自带的库中,优先队列使用的正是斐波那契堆或者平衡二叉树、红黑树实现的
以下是对优先队列的一个运用示例:
Leetcode:求解数组中第K大元素是多少:
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/submissions/
# 利用大小为k的优先队列来查找整个数组中的第k大元素
from queue import PriorityQueue
q = PriorityQueue(k)
if nums:
for n in nums:
if not q.full():
q.put(n)
else:
min_top = q.get()
if min_top < n:
q.put(n)
else:
q.put(min_top)
return q.get()
注:这道题用优先队列显然不是一个高效率的解法,可采用类似快速排序的思想求解。还有,为什么python内置的队列没有Java内置队列中像peek()函数的功能呢。。。。。