首页 > 编程语言 >【算法训练】二分查找

【算法训练】二分查找

时间:2023-02-06 17:06:05浏览次数:42  
标签:二分 03 int top mid 算法 查找 ans buf


二分查找

二分查找建立在待查找元素有序的前提上

例题
题目描述

输入N个学生的学号,然后查询输入
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个 M(M<=10000),接下来会有 M 行,代表 M 次查询,每行输入 一个学号,格式如下:
02
03
01
04

输出:

输出M行,,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”

样例输入

4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03

样例输出:

02 刘唐 男 23
03 张军 男 19
01 李江 男 21
04 王娜 女 19
03 张军 男 19

考虑到时间复杂度,采用二分查找

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct Student{
char no[100];//学号
char name[100];//姓名
char sex[5];//性别
int age; //年龄
bool operator < (const Student &A) const{
//重定向小于运算符
return strcmp(no,A.no);
}
}buf[1000];
int main(){
int 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 m;
scanf("%d",&m);
while(m-- !=0){
int ans=-1;//目标元素下标初始化为-1
char x[30];
scanf("%s",x);//输入待查学号
int top=n-1,base=0;//初始化,开始下标为0,结束下标为n-1,查找子集为整个数组
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\n",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
}
}
}
return 0;
}

除了查找某特定元素是否存在以为,二分查找还有另一类非常重要的作用,即定界。
例如,在一个升序的数组中,确定一个下标点,使在这个下标点之前(包括该下标点)的数字均小于等于目标数字。

//存在一个升序的有序数组buf,其大小为size,目标数字为target
int base =0,top=size-1;
while(base<=top){
if(top<=target) break;
int mid=(base+top)/2;
if(buf[mid]<=target) base=mid+1;
else top=mid-1;
}
int ans=top;


标签:二分,03,int,top,mid,算法,查找,ans,buf
From: https://blog.51cto.com/u_15955908/6039815

相关文章

  • 【算法训练】Hash的应用
    Hash的应用当数据较为庞大,但是数据的数量是有限范围内的,各不相同的。例题题目描述给你n个整数,请按从大到小的顺序输出其中前m大的数。输入每组测试数据有两行,第一行有两个......
  • centos查找已安装的jdk路径的方法
    在可执行java命令的情况下查找过程如下:执行whichjava[root@localhost~]#whichjava/usr/bin/java执行ls-lrt/usr/bin/java[root@localhost~]#ls-lr......
  • 欧几里得算法及其扩展
    欧几里得算法及其扩展前言整除:对于整数\(a(a\ne0)\)和\(b\),如果\(\existsq\inZ\),使得\(b=a\timesq\),则称\(a\)能整除\(b\),记作\(a\midb\)。否则,称\(a\)......
  • 查找算法之斐波那契查找
    由来:斐波那契数列:前两项之和等于第三项,假如下标为k,那么f[k]=f[k-1]+f[k-2]。如果将一条长为f[k]的线段分为两条线段,它们的长度分别为f[k-1]和f[k-2],这种分法很接近黄......
  • 《区块链基础知识25讲》-第十讲-哈希算法
    无论输入数据的大小及类型如何,均可以将输入数据转换成固定长度的输出加密哈希算法拥有的特征能为任意类型的数据快速创建哈希值确定性:相同输入必定产生相同哈希值,换句话说,......
  • 代码随想录算法训练营第十八天|LeetCode 513.找树左下角的值、112. 路径总和 、113.路
    513.找树左下角的值文章:代码随想录(programmercarl.com)视频:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路(......
  • sql语句重复数据的查找和删除
    一、查找重复记录1.查找全部重复记录单字段:Select*From表Where重复字段In(Select重复字段From表GroupBy重复字段HavingCount(*)>1)多字段:selectidfrom......
  • 《剑指Offer》-4-二维数组中查找/力扣-240-搜索二维数组Ⅱ
    从最后一列的第一个数字开始比较,依次倒数第二列第一个数字、倒数第三列...找到第一个<=target的数字,这样可以将范围缩小到一列然后用二分查找快速判断目标元素有没有......
  • 机器学习中入门级必学的算法有哪些?
    文章目录​​一、K-近邻算法​​​​二、线性回归​​​​三、逻辑回归​​​​四、决策树算法​​​​五、集成算法​​​​六、聚类算法​​一、K-近邻算法什么是k-近邻算......
  • 《剑指Offer》-53-在排序数组中查找数字/力扣-34
    Ⅰ统计一个数字在排序数组中出现的次数 intsearch(vector<int>&nums,inttarget){ intcount=0; for(intnum:nums){ if(num==target)count++; ......