堆的扩展

堆(heap)是实现有限队列的首选,在上一篇文章中有讲解。

这篇文章将堆的变种
二项堆 斐波那契堆

二叉堆的主要操作时
insert() O(logn) 在尾部插入元素并siftUp调整堆
extractMin() O(logn)删除堆顶元素并将最后一个放在堆顶 用siftDown调整
peek() O(1)
delete() O(logn)
heapify() O(n)
要实现堆的操作要涉及两个函数siftDown siftUp.

建堆的思路:
1.不停的insert(insert调用siftUp)
2.将一个数组变成一个堆 从底向上每个位置siftDown调整

关于具体的代码实现 正在写

堆的应用
1.堆排序
常用的 稳定的 高效的排序算法 堆排序 时间复杂度(nlogn) 空间(o1)

思想
n个元素的无序数组nums ,构建一个heap ,依次执行n次extractMin得到最小元素,执行n次得到的就是排列好的顺序

但是由于相同的两个键位于两颗子树中,两个元素的顺序会在堆调整时发生改变 所以是不稳定排序
降序 小跟堆
升序 大根堆

2.优先队列
优先队列的应用场景:
Dijkstras 单源最短路径
Huffman 构建最优的前缀树
Prims 最小生成树
Bestfirst serach

3.海量数据 top-k问题
思想 维护一个大小为k的二叉堆然后不断比较堆顶元素 判断是否替换堆顶元素
时间复杂度n*logk k和n差距很大 此方法有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值