算法题16 二分查找及相关题目
来源:互联网 发布:为什么江老是被黑 知乎 编辑:程序博客网 时间:2024/05/16 13:41
对于一个排序数组来说二分查找的时间复杂度是O(logn)
1. 二分查找法
1 int BinarySearch(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 int low=0,high=len-1; 6 while(low < high) 7 { 8 int mid = low+(high-low)/2; 9 if (arr[mid]>target)10 high = mid-1;11 else if (arr[mid]<target)12 low = mid + 1;13 else //find the target14 return mid;15 }16 //the array does not contain the target17 return -1;18 }
2.二分查找之寻找边界
这种边界的寻找分为2种:最后1个小于某数的值,低边界;第1个大于某数的值,高边界,情况不同在遍历查找时边界的调整也不同。
1)最后1个小于某数的值
1 int FindLastSmallerNum(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 6 int low=0,high=len-1; 7 while(low<high) 8 { 9 int mid = low+(high-low)/2;10 //大于等于的时候边界往前移11 if (arr[mid]>=target)12 high=mid-1;13 //小于的时候边界mid处多移1步有可能将小值跳过去,因此调整到mid处14 else if (arr[mid]<target)15 low=mid;16 //判断high是否已经小于目标值17 if (arr[high]<target)18 {19 return arr[high];20 }21 }22 23 return -1;24 }
2) 第1个大于某数的值
1 int FindFirstBiggerNum(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 6 int low=0,high=len-1; 7 while(low<high) 8 { 9 int mid = low+(high-low)/2;10 //大于等于的时候边界往前移11 if (arr[mid]>target)12 high=mid;13 //小于的时候边界mid处多移1步有可能将小值跳过去,因此调整到mid处14 else if (arr[mid]<=target)15 low=mid+1;16 //判断high是否已经小于目标值17 if (arr[low]>target)18 {19 return arr[low];20 }21 }22 23 return -1;24 }
3. 二分查找之旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。例如数组{3,4, 5, 1, 2 }为{ 1,2,3, 4,5}的一个旋转,该数组的最小值为 1。
仔细观察会发现旋转数组的最小值左边的数都大于最后一个数,右边的数都小于等于最后一个数,那么在二分查找的过程中与最后一个数比较来调整查找区间即可
1 int FindMinNum(int arr[],int len) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 6 int lo=0,hi=len-1; 7 int mid=0; 8 while (lo<hi) 9 {10 mid=lo+(hi-lo)/2;11 if (arr[mid]>arr[hi])12 {13 lo=mid+1;14 }else if (arr[mid]<=arr[hi])15 {16 hi=mid;17 }18 }19 return arr[lo];20 }
关于二分查找,http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 这篇博客也有很好的总结。
引述该博客:
二分查找法的缺陷
二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:必须有序。
我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。
数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。
解决这些缺陷问题更好的方法应该是使用二叉查找树了,最好自然是自平衡二叉查找树了,自能高效的(O(n log n))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。
- 算法题16 二分查找及相关题目
- 二分查找相关题目
- 二分查找相关题目总结
- 二分查找的相关算法题
- 二分查找算法及分析
- 算法题:二分查找
- Java 二分查找算法及效率比较
- 二分查找算法及python实现
- 二分查找题目汇总
- 题目:二分查找
- 查找算法 二分查找
- 查找算法:二分查找
- 算法--查找--二分查找
- 查找算法---二分查找
- 贪心算法及相关题目(一)
- 二分查找(折半查找)算法及代码
- 二分图匹配相关算法与题目讲解
- 二分图匹配相关算法与题目讲解
- 数据仓库专题20-案例篇:电商领域数据主题域模型设计v0.1(改进意见征集中)
- android 反编译
- android触摸事件传递
- 在 Web 项目中应用 Apache Shiro
- 算法题15 二叉树的最长的路径长度&&最大路径和
- 算法题16 二分查找及相关题目
- Android 如何进行js交互
- 算法题17 重建二叉树
- 百度糯米产品分析
- 算法题18 二叉树的前序、中序、后序、分层遍历
- 算法题19 把数组排成最小的数
- libcurl的使用
- Android仿IOS地区弹出框选择器
- 算法题20 数值的整数次方