二分查找与二分答案

简介: 二分查找与二分答案

1.区分二分查找与二分答案:

二分查找: 在一个有序的数据集合中进行二分(类似于折半)的方法,找到自己想要的数据,大幅度减小时间复杂度,二分算法的时间复杂度为 O(log n)。

二分答案:答案在某一个区间内,利用二分算法不断地缩小答案区间,最终得到答案。在大多数二分答案的题目中,解题思路一般为:判断+二分

2.二分查找:

(1)在两头闭合的区间中查找目标数据,如 区间[2,3]等。直接上代码--

#include<bits/stdc++.h>
using namespace std;
const int N = 10005;
int n,target,a[N];
int main()
{
  cin>>n>>target;          //target为想要查找的数字的值
  for(int i=0;i<n;i++)     //若i的初始索引为0
  {
    cin>>a[i];
  }
  sort(a,a+n);             //使用二分查找算法时,一定是针对单调队列来使用的,所以要先进行排序
  int left = 0;  
  int right = n-1;
  while(left<=right)
  {
    int mid = left + (right-left)/2;      //数据较小时也许你可以直接写(right+left)/2,在 
一些数据较大的题目中,(right-left)/2可以帮助减小数据大小
    if(mid>target)
    {
      right = mid-1;
    }
    else if(mid<target)
    {
      left = mid+1;
    }
    else
    {
      cout<<mid;     //mid作为返回值返回的是目标所在的位置
      break;
    }
  }
  return 0;
}

两头闭合时二分查找算法中最经典的模型,但也有很多要注意的点,比如要先用sort函数排序以保证数据的单调性,以及left和right的取值问题,当for中的i的初始索引为0时,left=0,right=n-1, 当for中i的初始索引是1时,则left=1,right=n。

3.二分答案:

什么是二分答案?
答案属于一个区间,当这个区间很大时,暴力超时。但重要的是——这个区间是对题目中的某个量有单调性的,此时,我们就会二分答案。每一次二分会做一次判断,看是否对应的那个量达到了需要的大小。
判断:根据题意写个check函数,如果满足check,就放弃右半区间(或左半区间),如果不满足,就放弃左半区间(或右半区间),一直往复,直至到最终的答案。

如何判断一个题是不是用二分答案做的呢?

典型特征:

求...最大值的最小 、 求...最小值的最大。
1.求...最大值的最小时,我们二分答案(即二分最大值)的时候,判断条件满足后,尽量让答案往前来(即:让right=mid)
2.求...最小值的最大时,我们二分答案(即二分最小值)的时候,判断条件满足后,尽量让答案往后走(即:让left=mid)

附上一道二分答案的经典题目:

洛谷P2678(跳石头问题)

#include<bits/stdc++.h>
using namespace std;
const int maxn = 50005;
int l,n,m;      // m---至多移走的石块
int a[maxn];
int sum[maxn];
bool check(int mid)
{
  int now = 0;
  int stone = 0;
  a[0] = 0;
  for(int i=1;i<=n+1;i++)      //有人回想问,为什么要算最后一块石头到终点的距离,最后一块石头不是不可以搬动么,我的回答是:最后终点的那块石头题目不允许搬,但是捏可以搬走他的前一块石头
  {
    if(a[i] - a[now] >= mid)
    {
      now = i;
    }
    else
    {
      stone++;
    }
  }
  if(stone <= m)
  {
    return true;
  }
  else
  {
    return false;
  }
}
int main()
{
  cin>>l>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
  }
  a[n+1] = l;
  sort(a,a+n);     //二分查找前进行排序是这个数组单调递增
  int left = 1;
  int right = l;
  int ans = 0;
  while(right >= left)        //二分查找最大距离
  {
    int mid = left + (right - left)/2;
    if(check(mid))         //检查最大距离是否符合标注
    {
      ans=mid;
      left = mid + 1;
    }
    else
    {
      right = mid - 1;
    }
  }
  cout<<ans<<endl;
  return 0;
}

题目思路:我们需要保证每两块石头之间的距离都要大于或等于mid,这样才符合mid时两块相邻石头的最小距离的标准,所以我们可以利用这个条件构造check函数,检查每一个通过二分求出的mid,判断其是否符合标准,若符合标准,则我们在此基础上继续进行二分,找到最大的那个mid,--此所谓“最小距离的最大值”。

 

相关文章
|
存储 Oracle Unix
关于小机 | 计算机百年趣味史(上)第8篇
小机即小型机(minicomputer),从名字上我们可以知道是体积会较小的机器,不过体积也是针对大机(mainframe)来说是,如果光从绝对体积上讲,那显然又不对。所以,小机是对特定时代一群类似机器的统称。我们来看下小机的关键历史。其历史时间是与大型机并行的。
3155 0
关于小机 | 计算机百年趣味史(上)第8篇
|
安全 前端开发 C++
C++视角下的Qt按钮:从基础应用到高级定制(二)
C++视角下的Qt按钮:从基础应用到高级定制
577 2
|
前端开发
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
2682 2
|
机器学习/深度学习 算法 Python
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
1688 0
一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
|
Rust 算法 Go
【密码学】一文读懂FNV Hash
FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。
4344 0
【密码学】一文读懂FNV Hash
|
6月前
|
机器学习/深度学习 人工智能 前端开发
基于YOLOv8的桥梁八类缺陷、病害高精度检测项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8与PyQt5开发,实现桥梁八类病害(如裂缝、腐蚀、混凝土退化等)的高精度自动检测,支持图片、视频、摄像头等多种输入方式,附带完整源码、数据集与训练教程,开箱即用,适用于科研、工程与教学场景。
基于YOLOv8的桥梁八类缺陷、病害高精度检测项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
7月前
|
传感器 移动开发 API
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
HarmonyOS 5 中的 UIAbility 是应用框架的核心组件,负责管理用户界面生命周期和上下文信息。它类似于 Android 的 Activity 或 iOS 的 UIViewController,主要用于与用户交互。本文详细解析了 UIAbility 的基本概念、启动页面设置、上下文获取、生命周期管理及常用操作(如终止实例、跨 Ability 信息传递)。
749 9
|
监控 安全 物联网
13位物联网卡与11位物联网卡有什么不同
物联网卡(IoT卡)的13位号码和11位号码之间存在一些关键差异。以下是针对这两者区别的详细操作步骤和解释:
|
12月前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
1024 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析