算法学习---查找(二)-二分查找

二分查找
题目:查找学生信息
时间限制:1秒  内存限制:32M 特殊判题:否
题目描述:
          输入N个学术的信息,然后进行查询
输入:
     输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
05
03
01
04
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”;
样本输入:
4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
05
03
01
04
来源:2003年清华大学计算机研究生机试真题

      对于此题要注意的是时间复杂度的问题。如果我们采用每次询问时线性遍历数组来查找是否存在我们需要查找的元素,那么,该算法的瞬间复杂度达到了O(n*m)(查找次数*每次查找所需比较的个数),而这个已经达到千万数量级,是我们所不愿意看到的。于是,我们只有另外找方法来解决该题。
没错就是用二分查找。未来符合查找空间单调有序的要求,我们首先要对所有数组元素按照学号关键字进行升序排列。当数组内各元素已经升序有序时,我们就可以在每次询问某个特定学号的学生是否存在时,使用二分查找来查找该学生。
      利用二分查找,原本O(n*m)的时间复杂度被优化到O(nlogn(排序)+m*logn),这个时间复杂度是符合要求的。
#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;
struct Student{//用于表示学生个体的结构体
	char no[100];//学号
	char name[100];//姓名
	int age;//年龄
	char sex[5];//性别
	bool operator < (const Student & A) const{//重载小于运算符使其能使用sort函数进行排序
		return strcmp(no,A.no)<0;
	}
}buf[1000];
int main(){
int n;
printf("test begins\n");
while(scanf("%d",&n)!=EOF){
   for(int i=0;i<n;i++)
	{
		scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
	}//输入
   int t;
   scanf("%d",&t);//有t组询问
   while(t--!=0){	
		int ans=-1;
		char x[30];
		scanf("%s",x);//待查找学号
		int top=n-1,base=0;//开始下标为0,结束下标为n-1,查找子集为整个buf数组
		while(top>=base){//当查找子集不为空集时重复二分查找
			int mid=(top+base)/2;//计算中间点下标
			int tmp=strcmp(buf[mid].no,x);
			if(tmp==0){
				ans=mid;
				break;//若相等,则查找完成跳出二分查找
			}else if(tmp>0) top=mid-1;//若大于,则结束下标变为中间点前一个点下标
			else
				base=mid+1;
		}
		if(ans==-1){//若查找失败
			printf("No Answer!\n");
		}else
			printf("%s %s %s %d",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);//若查找成功
   }
}
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值