分治法-二分检索

来源:互联网 发布:西科软件靠谱吗 编辑:程序博客网 时间:2024/06/06 14:14

基本思想
–为解决一个大问题,可以
1.把它分解成两个或多个更小的问题;
2.分别解决每个小问题;
3.把各小问题的解答组合起来,可得到原问题的解。
–小问题通常与原问题相似或同质 ,因而可以递归地使用分而治之策略解决。

用分治法解决二分检索问题:

问题的描述
–已知一个按非降次序排列的元素表a1, a2, …,an,判定某给定的元素x是否在该表中出现。
若是,则找出x在表中的位置并返回其所在下标
若非,则返回0值。

分治求解策略分析:
–定义问题的形式描述:I=(n, a1, a2, …,an, x)
–问题分解:选取下标k,由此将I分解为3个子问题:
I1=(k-1, a1, a2, …,ak-1,x)
I2=(1, ak, x)
I3=(n-k, ak+1, ak+2, …, an, x)
–对于I2,若ak=x,则有解k,对I1、I3不用再求解;
–否则
若x<ak,则只在I1中求解,对I3不用求解;
若x>ak,则只在I3中求解,对I1不用求解;
–I1 、I3上的求解可再次采用分治方法划分后求解(递归过程)

二分检索伪代码:

procedure BINSRCH(A, n, x, j)integer low, high, mid, j, n;low←1; high←n;while low ≤ high domid ← (low+high)/2case:x<A(mid): high←mid-1:x>A(mid): low ←mid+1:else: j←mid; returnendcaserepeatj←0end BINSRCH

通过测试的代码如下:

#include <iostream>using namespace std;/*二分检索功能输入:数组,数组的长度,需要检索的数输出:返回检索的数在数组的下标*/int binsearch(int a[],int n,int x){    int low,hign,mid;    low = 0;    hign = n-1;    while(low <= hign)    {        mid = (low+hign)/2;        if(a[mid] == x)            return mid;        else if(a[mid] < x)            low = mid +1;        else            hign = mid -1;    }    return 0;}int main(){    int a[9]= {-15,-6,0,7,9,23,54,82,101};    cout << "binSearch number 101 index is:"<<binsearch(a,9,101)<< endl;    return 0;}



 

原创粉丝点击