二分搜索
2017-10-29 20:36
141 查看
一、适用条件
二分搜索采用分治法。分治法基本思想是将一个规模为n的问题分解为k个规模较小的子问题。其适用条件为:原问题在规模缩小到一定程度时很容易求解
原问题可以分解为若干个规模较小的子问题
子问题互相独立且与原问题相同
子问题的解可合并为原问题的解
二、算法实现
问题:从给定的已排好序的n个元素a[0:n−1]中找出一个特定元素x。解决该问题可以使用递归和非递归两种方式
2.1递归方法
1. template<typename T> 2. int BinarySerach(T a[], int left, int right,const T& x) 3. { 4. while(left <= right) { 6. int middle = (left + right) / 2; 5. if (a[middle] > x) 6. return BinarySearch(a, left, middle - 1, x); 7. if (a[middle] < x) 8. return BinarySearch(a, middle + 1, right, x); 9. else 10. return middle; 11. } 12. return -1; 12. }
2.2非递归方法
1. template<typename T> 2. int BinarySearch(T a[], const T& x, int n) 3. { 4. int left = 0; int right = n - 1; 5. while (left <= right) { 6. int middle = (left + right) / 2; 7. if (a[middle] == x) return middle; 8. if (a[middle] < x) left = middle + 1; 9. else right = middle - 1; 10. } 11. return -1; 12. }
2.3寻找下界
1. template<typename T> 2. int BinarySearch(T a[], const T& x, int n) 3. { 4. if (rignt < left) return -1; 4. int left = 0; int right = n - 1; 5. int middle = (left + right + 1) / 2; 5. while(right >= left) { 6. if(a[middle] < x) left = middle; 7. else right = middle - 1; 8. middle = (left + right + 1) / 2; 9. } 10. return middle; 11. }
求中间索引采用向上取整的原因是防止陷入死循环。二分法求上界的算法与此相似,也是采用半边检索方式寻找目标值。
二分检索缺点是检索序列必须为有序序列,当检索序列中含有重复值时需搜索出上界和下界,中间的范围为所求值。
相关文章推荐
- hdu 2446 二分搜索解题报告
- Subsequence 【poj-3061】【二分搜索】
- SDAU训练日志第23篇----------搜索与查找二分hdu练习(1)(2018年3月16日)
- 【菜鸟er】搜索专题_二分思想的应用_计算最优解
- 最大化平均值---二分搜索
- C. Modified GCD(二分加搜索约数)
- 二分排序:直接插入排序+二分搜索
- [LeetCode] Search for a Range 二分搜索
- codeforce 760 B Frodo and pillows 二分搜索
- 插值搜索——本质和二分无异,是利用数据分布的规律来定查找点,其基本假设是数据分布均匀
- 二分搜索错误情况的分析
- HDOJ 题目2141 Can you find it?(二分搜索)
- CSU-ACM2017暑假集训2-二分搜索 poj-2456 Aggressive cows-最大化最小值
- CSU-ACM2017暑假集训2-二分搜索 C - 4 Values whose Sum is 0
- Pku oj 1064 Cable master(二分搜索)
- 二分搜索及其扩展(循环递增数组的搜索)
- 北大,STL简单整理 sort+二分搜索
- POJ 2976 Dropping tests、3111 K Best (二分搜索)
- HDU 2289(搜索题,二分、几何)
- 算法实现(3)二分搜索技术