分治法-二分检索
来源:互联网 发布:西科软件靠谱吗 编辑:程序博客网 时间: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;}
- 分治法-二分检索
- 分治法:二分检索算法
- 分治法-----二分查找
- 分治法:二分搜索
- 分治法-二分搜索
- 分治法---二分搜索技术
- 分治法之二分查找
- 二分思想和分治法
- 二分检索
- 二分检索
- 分治思想的几个算法:二分检索、快排、归并排序
- 【分治法】分治法与二分搜索,棋盘覆盖问题
- 分治法_二分查找法
- 分治法的典型例子 --- 二分搜索
- 二分搜索技术(分治法)
- 分治法——二分搜索
- 分治法——二分查找
- 二分思想与分治法、排序思想
- opengl win32 nehe
- pre-commit.bat好用的
- VS编译器常见错误中英文对照表
- APK 反编译为源码
- 菜鸟从零学习数据库(五)——MySQL必备命令
- 分治法-二分检索
- android ant编译, 找不到符号: 方法 setRoundingMode(java.math.RoundingMode) ,编译失败
- 笔记-------模态窗口提交的时候会打开新窗口问题的解决方法
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- 编译android2.3源码过程中的错误
- 总结一下HBase各种级别的锁以及对读写的阻塞
- Android控件基本属性介绍
- android上传图片
- 内部类经验总结