二分检索(分治)

二分检索(分治)

分治二分检索
基本思路:1 ,2 ,3 ,4 ,5,6 ,7,8,9在这9个元素中(有序数组),请检索元素5,是否在这9个元素中,如果利用普通的循环的话如果这堆元素有很大,比如说10000000个元素,计算机肯定会超时!利用分治的思想可以很好的解决这个问题!

示例:
6个元素数组(23 34 46 768 343 343),检索给出的4个数(2 4 23 343)是否在数组中,是的话输出YES,否则NO
[cpp]
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
 long long *p,*q,i;
 int m,n,t;cin>>m>>n;
 p=new long long[m];
 q=new long long[n];
 for(i=0;i<m;i++) cin>>p[i];
 sort(p,p+m);
 long long low,high,mid;
 for(i=0;i<n;i++)
 {
 low=0,high=m-1;
 t=0;cin>>q[i];
 while(low<=high)
 {
 mid=(low+high)/2; //代码核心部分 low为上界,high为下界,mid为中间标记
 if(p[mid]>q[i]) high=mid-1;//如果元素比待检索元素大,缩小下界范围
 else if(p[mid]<q[i]) low=mid+1;//如果元素比待检索元素小,缩小上界范围
 else {t=1;break;}
 }
 if(t) cout<<“YES”<<endl;
 else cout<<“NO”<<endl;
 }
 delete[] p,q;
 return 0;
}
[/cpp]