• 自下而上建堆(heap)的时间复杂度证明


    作者:Tobin
    日期:2019/04/13
    缘由:看python cookbook时,用到了heapq的库,书中提到,如果仅仅是返回一个数组的最大值,用max就可以了,但是如果返回多个较大或者较小元素用堆,如果返回的个数接近于数组本身的元素个数时,直接用排序即可。那么我在想,为啥返回几个元素的时候用堆效果比较好呢?于是我翻开了尘封许久的《算法导论》。

    什么是堆

    堆是一种数据结构。二叉堆是一个数组,近似于一个完全二叉树。树上的每个结点对应于数组的一个元素,除了最底层外树是充满的。下面的图是一个小根堆。即父节点的值要小于子结点,大根堆要相反。

    堆有哪些操作?复杂度如何证明。

    建堆操作,调整操作,利用前两个进行的堆排序操作(建完堆后,不断将第一个元素与最后一个元素进行交换,然后调整,复杂度O(nlogn)。
    主要是想记录下复杂度的证明,具体的堆如何操作就不细讲了,可以参考其它博客。
    见图。

    复杂度上界是O(2n),在这之后,每次取一个最大元素并剔除后,进行调整的复杂度是O(logn),也就是说在建完堆后,每次需要到最大值得复杂度是O(logn)。显然在返回多个较大元素的情况下,建堆进行操作的速度比遍历要快,遍历每次需要O(n)的时间。

    堆有什么作用呢?

    优先队列的底层是用堆来实现的。

  • 相关阅读:
    【XR-4】文本编辑器
    二十四、JMeter实战-Linux下搭建JMeter + Ant + Jenkins自动化框架
    Python 接口自动化
    Docker 部署 Tomcat
    CentOS7 查看 ip 地址
    Python
    Python接口自动化 -RESTful请求方法封装
    Python接口自动化
    Python
    xcode 编译webdriveragent
  • 原文地址:https://www.cnblogs.com/zuotongbin/p/10702001.html
Copyright © 2020-2023  润新知