您的位置:首页 > 其它

二分查找及STL

2017-09-21 21:50 183 查看
二分查找及STL函数
一个人在决定与计算机打交道时,就注定与2分不开,当然不是说性格,2在算法中应用得极为广泛,倍增、二叉树、二分答案、快排、快速幂……当然,最基础的还是二分查找。
针对在一个序列中查找一个数的问题,我们当然可以暴力枚举,但是在面对大数据时,未免有些不够看,相信玩过猜数游戏的哥们应该知道怎么快速的猜到一个范围内数,那就是每次猜中间,这就是二分的思想,但是,这有一个前提:有序数列
先献上我丑陋的模板代码:
#include <bits/stdc++.h>
using namespace std;
int a[1000],p,n;
int binary_s(int l,int r,int tar)//l是搜索范围左边界,r是右边界,tar是所搜索的数
{
int mid=(l+r)/2;//二分
if(tar==a[mid])
return mid;//找到了就返回下标
else if(a[mid]>tar)  binary_s(l,mid-1,tar);//大了,在更小的一半找
else if(a[mid]<tar)  binary_s(mid+1,r,tar);//小了……
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);//记得排序哦
cin>>p;
int temp=binary_s(1,n,p);
cout<<a[temp]<<endl;
return 0;
}
接下来的几段对于纯代码爱好者就不用看了……对于二分这种常用函数当然是有STL的啦!
1.函数结构及种类
1.binary_search(目标数组头地址,搜索上界地址,目标数字);
2.lower_bound(目标数组头地址,搜索上界地址,目标数字);

3.upper_bound(目标数组头地址,搜索上界地址,目标数字);

2.返回值
1.binary_search返回一个布尔值,1就是找到了目标,0就是没有
2.lower_bound返回数组中第一个大于等于目标数字的地址!!地址!!
3.upper_bound返回数组中第一个大于目标数字的地址!!地址!!
3.注意事项
    1.有序数列,先sort一发
2.头文件啊#include
<algorithm>
3.lower_bound和upper_bound返回值要转化为下标记得减一个头地址,像这样
int a[10000],n;
lower_bound(a,a+10000,n)-a;
upper_bound(a,a+10000,n)-a;


至于模板题……全网到处都是,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: