首页 > 其他分享 >二分查找与二分答案(1.)

二分查找与二分答案(1.)

时间:2024-04-10 21:29:07浏览次数:21  
标签:二分 int 单词 查找 low 答案 字典

1.二分查找

大家还知道怎么在一本很厚的词典查找一个单词吗?字典中的单词是按照“字典序”进行排序的,比如 code<pan<pancake 。如果我们要找一个单词,就要将字典从中间翻开,然后将这面单词跟想要找的单词比较。如果这面单词在需要寻找的单词之前,就将字典往后翻,否则就往前翻,直到找到准确的单词为止。

大家可以发现,越接近需要查询的单词,翻动书面的页数就越少。你肯定不会从第一页开始一面一面翻,逐个查看每个单词是否就是自己想要查的单词,这样做就太慢了。虽然实际情况不是那么精确,但是基本上使用了“二分思想”。

如果序列是有序的,就可以通过二分查找快速定位所需要的数据。除此之外,二分思想还能求出可行解的最值问题,比如想知道某款手机最高能多少楼高度摔下来而不会摔坏,使用二分的方式可以用最小实验次数就能得到结果(当然你需要准备好几个样品)。

推荐题单:(洛谷题单)【算法1-6】二分查找与二分答案

例题1

P2249 【深基13.例1】查找

输入样例:

        11 3

        1 3 3 3 5 7 9 11 13 15 15

        1 3 6

输出样例:

        1 2 -1

分析:

        直接从头到尾搜索一遍查找数字是不可行的。一旦数字太多,便容易RE(超出时间限制),效率太低。不过,这种做法没有用到题目没有用到题目给出的一个条件:保证序列数组为升序(如果数组不是按顺序排列就需要一个排序函数----sort)能否得到时间复杂度更优的做法呢?

        回顾一下“翻字典”的例子,要在整本字典中查找一个单词,安排首尾两个指针:首指针是第一页,尾指针是最后一页。然后将这本字典从中间分为前半本和后半本,并且将分割处的单词和需要找的单词进行比较,要么运气比较好,刚好分割处就是我们要找的单词,要么分割处的单词在我们要查找的单词前----就继续只看前半部分字典,否则只看后半部分字典。改变首尾指针,缩小查找范围,直到找到需要的单词为止。

代码:
#include<iostream>
using namespace std;
int Sert(int a[],int n,int x){
	int high=x-1,low=0,mid;
	while(low<=high){
		mid=(low+high)/2;//中间页数
		if(a[mid]>=n) high=mid-1;//取区间前一半
		else low=mid+1;//取区间后一半
	}
	if(low<x&&a[low]==n) return low+1;//找到了
	return -1;//没找到
}
int a[1000000],m,b,n;
int main(){
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	while(m--){
		scanf("%d",&b);
		printf("%d ",Sert(a,b,n));
	} 
	return 0;
} 

未完待续

标签:二分,int,单词,查找,low,答案,字典
From: https://blog.csdn.net/2401_84149360/article/details/137515684

相关文章

  • 在Linux终端查找指定类型的文件并统计数量
    下面举例说明:find/path/to/directory-typef-execfile{}\;|grep"MIDI"它的作用是在指定的目录(/path/to/directory)中搜索所有的文件(-typef),然后使用file命令检查每个文件的类型,并将结果通过管道传递给grep命令,用于过滤出包含"MIDI"关键词的文件信息。find:......
  • Linux之文件查找
    一.find  路径  条件  动作1.按文件名查找eg:find/etc-name"zxy"查找所有以8开头以9结尾的文件eg: find/ -name"8*"-o-name"*9" 2.按文件类型查找find/dev-typef查找普通文件d目录l链接b块设备c字符设备s套接字p管道文件3.按文件大小来......
  • 哈希(散列)查找
    1.哈希表(HashTable)(1)哈希表定义又称散列表,是一种数据结构,数据元素的关键字与其存储地址直接相关(2)同义词若不同的关键字通过散列函数映射到同一个值,则称为“同义词”(3)冲突通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”(4)填装因子装填因子=表中记录......
  • 2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)
    一、测试理论3.1你们原来项目的测试流程是怎么样的?我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议,我们会把不明白不理解的需求在会议上说出来,包......
  • 2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)
    一、测试理论3.1你们原来项目的测试流程是怎么样的?我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议,我们会把不明白不理解的需求在会议上说出来,包......
  • C++U4新-第06课-二分答案
    二分答案学习目标 先学习单调性,二分查找的单调性意思二分答案单调性 二分答案的思路  [【二分答案】-砍树] #include<iostream>usingnamespacestd;intmain(){intn,m;inttree[1000005];cin>>n>>m;for(inti=1;i<=n;i......
  • 你的信用信息是否已被滥用?大数据报告告诉你答案!
    近日,有网民遭遇线上私人申贷后信息被威胁曝光,担忧遭受恶意申贷。她们希望通过大数据报告来确认是否有不明的贷款申请。那么,查询大数据报告是否能有效防范信息泄露和恶意申贷呢?让我们一探究竟。首先,了解大数据报告的核心功能:大数据报告的核心在于检测多头借贷情况。它会根据......
  • 蓝桥杯-【二分】求阶乘
     思路:对于有几个0,10一定会是5的整数倍,2的因子数一定比5的多,所以只要算5的个数即可, 30%,每个n都去算#include<bits/stdc++.h>usingnamespacestd;#definelllonglongllcheck(lln){//计算n!末尾有多少个0llcnt=0;while(n)cnt+=......
  • 蓝桥杯备考随手记: Java 中常用的排序和查找方法
    1.排序方法Arrays.sort():用于对数组进行排序。它使用优化的快速排序算法来对数组进行排序。示例代码:int[]arr={5,2,8,1,6};Arrays.sort(arr);Collections.sort():用于对集合进行排序。它使用优化的归并排序算法来对集合进行排序。示例代码:List<Integer>list......
  • python画信封 2024年3月青少年电子学会等级考试 中小学生python编程等级考试一级真题
    目录python画信封一、题目要求二、算法分析三、程序代码四、程序说明五、运行结果六、考点分析七、推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python画信封2024年3月python考级一级真题一、题目要求龙年到了,我们要给远方的亲人写一封新年贺信,请用turtle......