优先队列实现机制

优先队列实现机制

优先队列实现机制主要有以下两种:

  1. Heap(Binary,Binomial,Fibonacci)
  2. Binary Search Tree

Heap有很多种实现形式,之前学习的小顶堆和大顶堆是二叉堆,不同结构的堆在实现同样的需求时所需时间复杂度也是不同的,具体如下图所示:
优先队列实现机制_第1张图片
注: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()函数的功能呢。。。。。

你可能感兴趣的:(数据结构,数据结构,优先队列)