zoukankan      html  css  js  c++  java
  • 最大heap

    1 什么是最大heap

    最大heap是一棵完全二叉树。每棵子树的根比它的两棵子树上的节点都要大。

    2 建堆的过程

    function max_heaptify(A):

        for (i = n/2向下取整;i > 0; i--):

            max_heaptify_one(A, i)

    function max_heaptify_one(A, i):

        [largerSon, largerSonIndex] = larger(A, i);

        if largerSon < A[i]:

            return

        else:

            tmp = A[i]

            A[i] = A[largerSonIndex]

            A[largerSonIndex] = tmp

            max_heaptify_one(A, largerSonIndex)

    3 建堆的时间复杂度

    o(n),线性的。

     假设要建的堆是一个满二叉树。从倒数第二层的最后一个结点往前都要进行以该结点为root的堆化,最坏情况下,每次堆化都要一直换到最底层的叶子结点处。

    倒数第二层的结点有2^(h-1)个,每个需要进行1次比较,故共要进行(2^(h-1)*1)次比较;

    倒数第三层的结点有2^(h-2)个,每个需要进行2次比较,故共要进行(2^(h-2)*2)次比较;

    ..................

    第一层有1个结点,需要进行h-1次比较,故共要进行(1*(h-1))次比较;

    加起来

    N =  (2^(h-1)*1) + (2^(h-2)*2) + ... + 1*(h-1) = (2-(2 + h)/(2^h)) * n

    (2-(2 + h)/(2^h)) < 2

    故O(n) = n,因此建堆的时间复杂度是线形的。

    算法分析的过程本质上分析的是该算法的上界,因此在计算不等式的时候,该放的时候就要放。

    4 堆排序

    Max_Heaptify(A)

    for i = 0; i < n; i ++:

        B[i] = A[1]

        A[1] = A[n - i]

        Max_Heaptify_one(A, 1)

    5 节点数为n的完全二叉树的非叶子节点个数为 n/2向下取整,叶子节点的个数为n/2向上取整

    5.1 n向上取整等式

    (n + r)整个的向上取整 = n向上取整 + r,这里r是整数

    这个可以根据定义来证明,并且定义的区间里面只有一个整数,所以是等价的。只要是在这个区间里面的所有的整数都是同一个,都是相等的。

    5.2 非叶子节点的个数求法如下

    假如整棵树共有h层,非叶子节点分为两个部分:

    第一,前h-2层的所有节点,总共2^(h-2) - 1

    第二,第h-1层的部分节点,等于最后一层的所有的叶子结点的个数/2取上限,因为每个非叶子节点至少有一个儿子,所以是取上限。

    最后一层的叶子节点数等于n - 2^(h-1) + 1,所以这一层的非叶子结点数为(n - 2^(h-1) + 1)/2向上取整。

    这样非叶子结点总数为

    2^(h-2) - 1 + (n - 2^(h-1) + 1)/2向上取整 = (n/2 - 1/2)向上取整 = n/2向下取整。

    因此也叶子结点总数为n/2向上取整,这样总共有n个结点。

    6 注意事项

    6.1 实现堆时是从数组的下标为1开始的,不是从0开始的

    A[0]是丢弃的,从A[1]开始。在比较根和两个儿子的大小的时候,是i和2i、2i+1进行比较的。

  • 相关阅读:
    P3916 图的遍历 题解
    NBL小可爱纪念赛「 第一弹 」 游记(部分题解)
    P4147 玉蟾宫 题解
    十、一些小例子
    九、基础正则表达式BRE
    八.linux系统文件属性知识
    七、linux目录结构知识---实战
    六、linux目录结构知识
    3.20-30岁形成好的习惯
    五、Centos linux系统优化-实战
  • 原文地址:https://www.cnblogs.com/hustdc/p/7593205.html
Copyright © 2011-2022 走看看