经典二分算法详解
2017-02-25 17:21
232 查看
二分算法是一种查找算法,是最基础的,最简单易学且高效实用的算法之一。
适用条件:序列有序,答案可以在一定范围内判断
时间复杂度O(logn)
例题:S(n)=1+2+...+n;给定s,按照要求求出n;
1.求出第一个大于等于给定数字的n
2.求出第一个大于给定数字的n
3.求出最后一个小于给定数字的n
4.求出最后一个小于等于给定数字的n
其他问法和不上升序列二分的用法只要略加改动就好,这里就不在列举了
另外C++STL中也有相应的二分算法,详情请点击下面的链接
C++STL实现二分算法
适用条件:序列有序,答案可以在一定范围内判断
时间复杂度O(logn)
例题:S(n)=1+2+...+n;给定s,按照要求求出n;
1.求出第一个大于等于给定数字的n
//不下降序列二分 #include<iostream> using namespace std; int a[10005]; int main() { int stand; for(int i=1;i<=10000;i++) a[i]=a[i-1]+i; while(cin>>stand) { int tail=10001,head=0,mid,ans; while(head<=tail) { mid=(head+tail)/2; if(a[mid]>=stand) ans=mid,tail=mid-1; //关键 else head=mid+1; } cout<<ans<<endl; //求出第一个大于等于的数字的n } return 0; }
2.求出第一个大于给定数字的n
//不下降序列二分 #include<iostream> using namespace std; int a[10005]; int main() { int stand; for(int i=1;i<=10000;i++) a[i]=a[i-1]+i; while(cin>>stand) { int tail=10001,head=0,mid,ans; while(head<=tail) { mid=(head+tail)/2; if(a[mid]>stand) ans=mid,tail=mid-1; //关键 else head=mid+1; } cout<<ans<<endl; //求出第一个大于给定数字的n } return 0; }
3.求出最后一个小于给定数字的n
//不下降序列二分 #include<iostream> using namespace std; int a[10005]; int main() { int stand; for(int i=1;i<=10000;i++) a[i]=a[i-1]+i; while(cin>>stand) { int tail=10001,head=0,mid,ans; while(head<=tail) { mid=(head+tail)/2; if(a[mid]>=stand) tail=mid-1; else ans=mid,head=mid+1; //关键 } cout<<ans<<endl; //求出最后一个小于给定数字的n } return 0; }
4.求出最后一个小于等于给定数字的n
//不下降序列二分 #include<iostream> using namespace std; int a[10005]; int main() { int stand; for(int i=1;i<=10000;i++) a[i]=a[i-1]+i; while(cin>>stand) { int tail=10001,head=0,mid,ans; while(head<=tail) { mid=(head+tail)/2; if(a[mid]>stand) tail=mid-1; else ans=mid,head=mid+1; //关键 } cout<<ans<<endl; //求出最后一个小于等于给定数字的n } return 0; }
其他问法和不上升序列二分的用法只要略加改动就好,这里就不在列举了
另外C++STL中也有相应的二分算法,详情请点击下面的链接
C++STL实现二分算法
相关文章推荐
- 机器学习经典算法详解及Python实现--聚类及K均值、二分K-均值聚类算法
- 机器学习经典算法详解及Python实现--聚类及K均值、二分K-均值聚类算法
- 精选微软经典的算法面试100题(第1-20题) -代码详解(题目选自“结构之法”大侠的博客,答案都是本菜鸟自己做的)
- 经典算法详解 之 递归算法
- 数据挖掘十大经典算法(详解)
- 经典算法详解(2):费氏数列
- 经典算法详解(1): 河内之塔
- 【经典算法】二分查找
- 机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用
- 经典算法详解 之 背包算法
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 机器学习经典算法详解及Python实现--元算法、AdaBoost
- 经典算法详解 之 冒泡排序
- 二分算法(折半算法)详解
- 二分算法(折半算法)详解
- 二分(折半)查找-经典算法
- 经典算法详解 之 递归算法
- 经典算法详解 之 背包算法
- 经典基础算法之BST详解(系列二)
- 经典算法:二分查找、插入排序、选择排序、冒泡排序