• 证明中序遍历O(n)


    算法导论12.1 什么是二叉搜索树


    二叉搜索树应满足的性质

    设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key <= x.key。如果y是右子树中的一个结点,那么y.key >= y.key。(这里是可以取等于的)

    例如:

         3    
        / 
    2 4
    /
    1 2

    可以容许相同的数。

    中序遍历,因为根的遍历在左右子树之间,顾名中序,也就是左根右。

    如上,中序遍历应该是:12234

    那么后续遍历就是左右根:12243

    前序遍历就是根左右:32124


    可以给出中序遍历的递归式伪码:

    inorderTree(x)
        if (x != NIL)
            inorderTree(x.left);
            print x.key;
            inorderTree(x.right);

    现在来证明中序遍历是O(n)的。

    T(n)表示n个节点中序遍历所需要时间。那么T(0) = c,c为常数,因为要判断x是否为NIL的常数时间。

    首先,最起码要遍历n个结点,所以下限为Ω(n)。只要再证明上限O(n)那么它就是O(n)的复杂度了。

    以下证上限:

    因为有左右子树,设左子树有k个结点,那么右子树就有n-k-1个。

    就有了递推式:

    T(n) <= T(k) + T(n-k-1) + d

    d类似常数c,是其他的常数操作。因为加了d,所以就用小于等于。

    那么证明T(n) = O(n)是等价于证明如下式子成立的:

    T(n) <= (c+d)*n + c

    T(0) = c 显然成立,数学归纳法:

    可以把红色部分的式子代入到前面那个式子的右边把右边的T(k) 和 T(n-k-1)替换掉就有了

    T(n) <= ((c+d)*k + c) + ((c+d)*(n-k-1)) + c) + d = (c + d)*n + c

    真神奇,可见红色部分成立,那么T(n)上限就是O(n)。

    综合上下限,所以T(n)的复杂度是O(n)。

  • 相关阅读:
    numpy 矩阵和数组
    python map()
    python matplotlib plot
    python mean()
    预测数值型数据:回归
    散点图
    非均衡分类问题
    AdaBoost元算法
    2.1 n元排列
    1.3 数域
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4129464.html
Copyright © 2020-2023  润新知