优先队列实现机制

本文探讨了优先队列的实现机制,包括Heap(二叉堆、多项式堆和斐波那契堆)和Binary Search Tree。二叉堆在某些操作上的时间复杂度相对较差,而斐波那契堆则提供了更好的效率。在Python和Java中,优先队列常由斐波那契堆或平衡二叉树实现。以LeetCode问题为例,说明了优先队列在求解第K大元素问题上的应用,但并非最佳解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优先队列实现机制

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

  1. Heap(Binary,Binomial,Fibonacci)
  2. 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()函数的功能呢。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值