[时间复杂度]为什么采用二叉排序树查找的平均查找长度为O(log2n)

###二分法求数值x的整数n次幂

有没有O(log n)的方法呢?得二分思想了。这里的二分是指减少乘法的次数,把重复的运算省去。我要求x的n次方,那么先求x的n/2次方,然后两个相乘起来。如此递归下去。

参考 剑指offer16题 110页

###切波那契Fibonacci数列的时间复杂度O(logn)

转自 https://blog.csdn.net/weixin_40123831/article/details/80398996

// 二分查找
//
//时间复杂度: log2(N) == lg(N)(最差情况)
int BinarySearch(int* array, int size, int data)
{
    int left = 0;
    int right = size - 1;
 
    int mid = left + ((right - left) >> 1);
 
    while (left <= right) //表示左闭右闭区间,可以取到边界数值;  如果left<right,表示左闭右开区间
    {
        if (data == array[mid])
        {
            return  mid;
        }
        else if (data < array[mid])
        {
            right = mid - 1;//右边界改变很重要
        } 
        else
            left = mid + 1;
    }
    return -1;
}

参考  https://blog.csdn.net/beautyofmath/article/details/48184331

https://blog.csdn.net/qq_37703616/article/details/82120258

http://emb.hqyj.com/Column/Column365.htm

###二叉排序树查找的平均查找长度为O(log2n)

推导过程如下:

假设有一颗二叉排序树, 总结点数是n, 高度是h, 根结点的高度是1,

假设也是满二叉树, n与h的关系, 有公式: n = (2^h) - 1 

也就是: h = log2(n+1)

 

对于高度为2,总结点数是3的二叉排序树(满二叉树),查找成功的平均查找长度为:

ASL = (1*1 + 2*2) / 3

 

对于高度为3,总结点数是7的二叉排序树(满二叉树),查找成功的平均查找长度为:

ASL = (1*1 + 2*2 + 3*4) / 7

 

对于高度为h,总结点数是n的二叉排序树(满二叉树),查找成功的平均查找长度为:

ASL = ( 1*1 + 2*2 + 3*4 + ... + h*2^(h-1) ) / n   [等式1]

 

对于[等式1]里的1*1 + 2*2 + 3*4 + ... + h*2^(h-1)

该数列有h项: 1*2^0, 2*2^1, 3*2^2, ... , h*2^(h-1)

其总和S = 1*2^0 + 2*2^1 + 3*2^2 + ... + h*2^(h-1)  [等式2]

 

等式两边同乘以2,有: 2*S = 1*2^1 + 2*2^2 + 3*2^3 + ... + (h-1)*2^(h-1) + h*2^h  [等式3]

用[等式3]减去[等式2]有:

S = h*2^h - (2^0 + 2^1 + 2^2 + 2^3 + ... + 2(h-1)) [等式4]

其中(2^0 + 2^1 + 2^2 + 2^3 + ... + 2^(h-1))是等比数列求和,设:

  M = (2^0 + 2^1 + 2^2 + 2^3 + ... + 2^(h-1))

等式两边同乘以2,有: 2*M = (2^1 + 2^2 + 2^3 + ... + 2^h)

两个等式相减,有: M = 2^h - 1

将M代入[等式4]有: S = h * 2^h - (2^h - 1) = (h-1) * 2^h + 1  [等式5]

 

因为 h = log2(n+1),将h代入[等式5],有:

S = [ log2(n+1) - 1 ] * 2^[log2(n+1)] + 1

  = [ log2(n+1) - 1 ] * (n+1) + 1

  = (n+1) * log2(n+1) - n

 

也就是 S = ( 1*1 + 2*2 + 3*4 + ... + h*2^(h-1) ) = (n+1) * log2(n+1) - n

 

将上述S代入[等式1],有: ASL = [(n+1) * log2(n+1) - n] / n

                          = [(n+1)/n] * log2(n+1) - 1

 

所以,二叉排序树查找成功的平均查找长度为: 

ASL = [(n+1)/n] * log2(n+1) - 1   [公式1]

 

其时间复杂度是: O(log2(n))

 

参考 https://blog.csdn.net/Walden1999/article/details/83659874

[代码]二叉排序树平均检索长度(ASL)的定义在这里不再赘述,在这里其计算方法就是:第一层元素个数 *1 + 第二层元素个数 *2 + 第三层元素个数 *3+……+第n层元素个数 *n 。

 

 

时间复杂度的题1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值