美文网首页
php-堆入门

php-堆入门

作者: 淡淡de盐 | 来源:发表于2020-09-27 10:01 被阅读0次

    \color{red}{堆}是一种特殊的树。满足下面这两点要求

    • 堆是一个完全二叉树
    • 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。

    第二点,也可以换种说法,堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。如下图


    image.png

    1、2大顶堆,根最大数越往下越小3是小顶堆,根最小越往下越大。4不属于完全二叉树

    堆排序O(nlogn)

    堆排序可以分为建堆和排序

    建堆

    建堆有2种方法从上到下或从下到上

    排序

    堆排序

    简单点说就是堆顶是最大数,把堆顶放到最后的位置。然后进行“堆化”,循环此动作,最后完成排序

    堆化:堆化就是把不符合堆特性的堆进行调整,让其重新满足堆的特性

    快速排序,平均情况下,它的时间复杂度为 O(nlogn)。堆排序时间复杂度也是 O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但是,在实际的软件开发中,快速排序的性能要比堆排序好,这是为什么呢?

    首先堆排序的不稳定性,从如一组有序数字,经过建堆后反而无序了,而且堆在频繁交换位置,当排序堆化时也是跳跃访问下标,效率也没有顺序访问好。

    堆常见应用

    定时器

    可以利用小顶堆的特性做定时器,最先开始的时间在堆顶。用当前时间减堆顶时间,时间到了之后执行就可以,这样就省去了时间没到不停循环的资源浪费。

    求 Top K

    可以利用小顶堆,比如取前5,就创建一个大小为5的小顶堆,遍历数据。如果数大于堆顶就删除堆顶,后把新数插入堆顶堆化。
    不同在哪呢,快排是先把分治思想左边小右边大然后在进行最后。堆直接堆化就可以。

    相关文章

      网友评论

          本文标题:php-堆入门

          本文链接:https://www.haomeiwen.com/subject/dryzyktx.html