二分

简介: 二分

最基础的二分我们经常用来查找序列中的某个数,当然这要求这个序列是单调的。

常见的二分查找代码如下:

int binary(int a[],int low,int high,int x){          //查找是否有此元素 
  int mid;
  while(low<=high)
  {
  mid=(low+high)/2;
  if(a[mid]=x)return mid;
     else if(a[mid]>x)high=mid-1;
  else {
    low=mid+1;
  }  
  } 
  return -1;    
}


基础拓展


如果我们需要查找大于等于x的第一个数,利用二分的思想,将上面的代码小改一下就如下了

int binaryone(int a[],int low,int high,int x) //第一个大于等于x的元素 
{   
int mid;
  while(low<high)
  {
  mid=(low+high)/2;
  if(a[mid]>=x)high= mid;
  else {
    low=mid+1;
  }  
  } 
  return low;   
}


可以发现判断条件那里做出了改变,因为不能排除这个数就是要找的数,所以high= mid。

如果再继续发问,找第一个大于x的数,只要把判断条件改为>x即可

所以二分推广过去直接把那里变成条件C,就可以得出第一个符合条件C的结果。

继而继续追问,如果要求最后一个满足条件C位置怎么办?可以求出第一个满足条件!C的元素的位置再减一就好。


实际上,上述程序没有考虑是否查找成功,只是可以增加一个上届n,对上界n处理即可。而事实上,算法文件里面也有under_bound(),upper_bound()分别与之对应。


快速幂


快速幂是一种简单而有效的小算法,它可以以O(logn)的时间复杂度计算乘方。快速幂不仅本身非常常见,而且后续很多算法也都会用到快速幂。

而快速幂也运用了二分法的思想:

如果求a的b次方,如果b是偶数,可以拆成两个b/2次方相乘,如果b是奇数,可以拆成a*a的(b-1)次方,如此二分,就可快速求幂。

#include <iostream>
using namespace std;
typedef long long LL;
 LL binarypow(LL a,LL b)                     //递归写法 
 {
  if(b==0)return 1;
  if(b&1)return a*binarypow(a,b-1);
  else{
    LL c=binarypow(a,b/2);       //注意这里用一个数来得到运算结果
    return c*c;
  }
 }
 LL binarypowone(LL a,LL b){                //迭代写法 
  LL ans=1;
  while(b>0){
    if(b&1){
    ans=ans*a;
   }
    a=a*a;
    b>>=1;
  }
    return ans;
  }
int main(){
  printf("%d %d",binarypow(7,13),binarypowone(7,13));
  return 0;
}
相关文章
|
存储
Rockchip系列之浅度分析LED状态灯 Driver篇(1)
Rockchip系列之浅度分析LED状态灯 Driver篇(1)
410 2
|
存储 虚拟化 数据安全/隐私保护
|
敏捷开发 监控 IDE
深入理解自动化测试工具Selenium的工作原理与实践应用
【5月更文挑战第26天】 随着敏捷开发和持续集成理念的普及,自动化测试在软件开发生命周期中扮演了至关重要的角色。Selenium作为最流行的自动化测试工具之一,以其开源、跨平台和支持多种编程语言的特性被广泛使用。本文将详细解析Selenium的核心组件,探讨其工作原理,并通过案例分析展示如何高效地实施Selenium进行Web应用的自动化测试。我们将从测试准备到结果分析的全过程,提供一系列实用的策略和最佳实践,帮助读者构建和维护一个健壮的自动化测试环境。
|
机器学习/深度学习 运维 监控
无人值守时代,运维如何保障发布质量?
阿里巴巴千亿交易背后,如何尽量避免发布故障?在面对实际运维过程中遇到的问题该如何解决?阿里巴巴运维技术专家少荃,给我们带来了解决方案和思路。
5293 0
|
消息中间件 NoSQL Java
Github霸榜!2023最新一线大厂Java八股文合集PDF版震撼开源
前言 金九银十已到,也不知道大家准备得怎么样,有没有为找到心仪的工作开始面试了,有没有准备不充分在各大平台找资料临时抱佛脚的朋友,不管你是找工作还是找资料,一定要看看我花1个多月为大家整理收集的“2023最新一线大厂Java八股文合集”,当你看了这份资料,定会有惊人发现。
1396 0
|
存储 SQL Cloud Native
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(上)——三、产品相关概念(中)
《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(上)——三、产品相关概念(中)
|
存储 并行计算 Cloud Native
PolarDB 开源版 轨迹应用实践 - 出行、配送、快递等业务的调度; 传染溯源; 刑侦
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍PolarDB 开源版 轨迹应用实践, 例如: - 出行、配送、快递等业务的调度 - 快递员有预规划的配送轨迹(轨迹) - 客户有发货需求(时间、位置) - 根据轨迹估算最近的位置和时间 - 通过多个嫌疑人的轨迹, 计算嫌疑人接触的地点、时间点
528 0
Vant UI 中 van-collapse 下拉折叠面板如何默认展开第一项
Vant UI 中 van-collapse 下拉折叠面板如何默认展开第一项
1010 0
Vant UI 中 van-collapse 下拉折叠面板如何默认展开第一项
|
Web App开发 Java 测试技术
反了!居然让我教她自动化测试!
Selenium 是个基于浏览器的 Web 自动化测试工具,基本上是自动化测试人员首选工具。因为相比其他工具,它有很多的优势:支持多种语言,比如 Python、Java、C或C#、ruby 等都支持;支持多种浏览器, 比如 IE、FireFox、Safari、Opera、Chrome 这些主流浏览器基本都支持;支持多种操作系统,比如 Windows、Mac、Linux 这个款主流操作系统。
反了!居然让我教她自动化测试!
|
JavaScript 前端开发
Javascript DOM操作
Javascript DOM操作
154 0
Javascript DOM操作