算法--二分检索总结

算法正确性证明:
检验到参数的每类取值
检验算法的每个分支

算法所需空间:
n+5

算法所需时间:
成功检索所需要的元素比较次数=级数
不成功检索所需要的元素比较次数=级数-1
考虑:
成功最好平均最坏
不成功最好成功最坏

在这里插入图片描述
对于含有n个内节点的二元树,证明E=2n+1。其中E,I分别为外部和内部路径长度。

当n=1时,E=2,I= 0,所以E(n)=I(n)+2n成立;
不妨假设 ,E(k)=I(k)+2k成立;
当n=k+1时,不妨对二元树中h级的叶子节点x(内节点)进行如下操作:
将内节点x从原树中移除,此时形成一颗新的具有k个节点的二元树,且E(K)=I(K)+2K。
当重新添加x到二元数时,则E(K+1)=E(K)-(h-1)+2h,I(K+1)=I(K)+(h-1)。
则E(K+1) = I(K)+2K-(h-1)+2h = I(K)+(h-1)+2K+2 = I(K+1)+2(K+1)。
即E(K+1) = I(K+1)+2(K+1)
#include <iostream>
using namespace std;

int a[10001];

//三分查找
int thrSearch(int l, int r, int x)
{
    if(l <= r)
    {
        cout << l << "test" << r << endl;
        int lMid = l + (r-l)/3;
        int rMid = lMid + (r-l)/3;
        if(x == a[lMid])
            return lMid;
        if(x == a[rMid])
            return rMid;
        if(x < a[lMid])
            return thrSearch(l, lMid-1, x);
        else if (x > a[rMid])
            return thrSearch(rMid+1, r, x);
        else
            return thrSearch(lMid+1, rMid-1, x);
    }
    return -1;
}

void Solve(void)
{
    double Left, Right;
    double mid, midmid;
    double mid_value, midmid_value;
    Left = MIN; Right = MAX;
    while (Left < Right)
    {
        mid = (Left + Right) / 2;
        midmid = (mid + Right) / 2;
        mid_area = Calc(mid);
        midmid_area = Calc(midmid);
        if (mid_area >= midmid_area) Right = midmid;
        else Left = mid;
    }
}

int main()
{
    for (int i = 1; i <= 5; ++i) {
        a[i] = i;
    }
    cout << thrSearch(1, 5, 4);
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值