"分析"二分法

讨论1.5 分析“二分法”

来自 MOOC 浙江大学 数据结构

查找算法中的“二分法”是这样定义的:

给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。

二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。

试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。

伪代码:

int twofen(int List[],int l,int r,int x){
    int mid;
    while(l<=r){
        mid=(l+r)/2;
        if(List[mid] == x) return mid;
        else if(List[mid] > x) r=mid-1;
        else l=mid+1;
    }
    return -1;
} 

分析:

最好情况下:T(n) = O(1),S(n) = O(1).
二分法每执行一次问题规模n = n / 2;最终将问题规模缩小到1,即最后才找到x或到最后都没有找到x;
/故有 n/(2^k)=1;解得执行次数k=log n(以2为底)
最坏T(n) = O(log n) (我们关注的是增长率,底数不重要故可忽略)
最坏T(n) = O(log n ); S(n) = O(1)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在数值分析中,二分法是一种常用的数值求根方法。它的基本原理是利用介值定理,对于闭区间[a,b]内的函数f(x),如果满足f(a)*f(b) < 0,那么函数f(x)在该区间内至少存在一个根。二分法的几何意义是不断减少区间长度的一半来逼近根,而区间的中点被用作近似解。二分法的终止条件是区间长度小于给定的精度要求。 在Matlab中实现二分法的基本代码如下所示: ``` [result,k = dichotomy(1,2,10^(-2),@f); disp([result,k]); %二分法函数 function [mid,k = dichotomy(a,b,e,f) k=-1; %k为迭代次数 while abs(b-a)>e mid=(a+b)/2; k=k+1; if f(mid)==0 break; elseif f(mid)*f(a)<0 b = (a+b)/2; else a = (a+b)/2; end end mid=(a+b)/2; k=k+1; end %原函数 function [y = f(x) y = x^3-x-1; end ``` 在这段代码中,我们定义了一个名为`dichotomy`的函数,它接受四个参数:初始区间端点a和b,精度要求e以及函数句柄f。函数内部使用了一个while循环来进行迭代,直到区间长度小于给定的精度要求。在每次迭代中,我们计算区间的中点mid,并判断mid是否为根或者根所在的区间。根据判断结果,更新区间的端点a和b,并计数迭代次数k。最后,返回近似解mid和迭代次数k。 为了使用该二分法函数,我们需要提供一个原函数f(x),在这里我们使用了一个例子函数`y = x^3-x-1`。 以上就是使用Matlab实现数值分析二分法的基本代码。您可以根据自己的具体问题和需求,修改函数参数和原函数,来使用该方法求解其他问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值