分治法——二分检索

1.分治法(Divide and Conquer)简介:

思想:
(1)将原始问题划分或者归结为规模更小的子问题
(2)递归或者迭代求解每个子问题
(3)将子问题的解综合得到原问题的解
应满足的条件:
(1)子问题与原始问题性质完全一样
(2)子问题之间可以彼此独立地求解
(3)递归停止时子问题可以直接求解

2.二分检索算法的基本原理:

前提是要检索的数组有序(此处假定为升序)。

迭代算法:
算法 Binary Search(T, l, r, x)
输入:数组T,下表从 l 到 r ;数 x 为要寻找的数
输出:j // 若 x 在数组中,j 为 x 的下标;否则为-1

while l<=r do
    m<-(l+r)/2
    if T[m] = x then return m
    else if T[m]<x then l <- m+1
         else r <- m-1
return -1

递归算法:
算法 Binary Search(T, l, r, x)
输入:数组T,下表从 l 到 r ;数 x 为要寻找的数
输出:j // 若 x 在数组中,j 为 x 的下标;否则为-1

if l<=r then
    mid <- (start+end)/2
    if T[mid]=x then return mid
    else if T[m]<x then Binary Search(T,mid+1,end,x)
    else Binary Search(T,start,mid-1,x)
else return -1

3.程序实现:

迭代实现:

int BinarySearch(int a[],int start,int end,int x)
{
    int mid;
    while(start<=end)
    {
        mid=(start+end)/2;
        if(a[mid]==x)
            return mid;
        else if(a[mid]<x) //x在右半部分
            start=mid+1;
        else  //x在左半部分
            end=mid-1;
    }
    return -1;  //未检索到x
}

递归实现:

int BinarySearch(int a[],int start,int end,int x)
{
    if(start<=end)
    {
        int mid=(start+end)/2;
        if(a[mid]==x)
            return mid;
        else if(a[mid]<x)  //x在右半部分
            BinarySearch(a,mid+1,end,x)
        else  //x在左半部分
            BinarySearch(a,start,mid-1,x)
    }
    else
        return -1;  //未检索到x
}

3.二分检索算法的时间复杂度分析:

可认为算法中基本操作是比较。

W(n)=W(n/2)+1
W(1)=1

很容易可以算出二分检索算法的时间复杂度为O(logn)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值