C++知识点总结(34):二分查找

二分

  • 一、二分
    • 1. 实例
    • 2. 意义
  • 二、程序
    • 1. 猜数字-次数.cpp
    • 2. 二分查找.cpp
    • 3. 二维二分查找.cpp
    • 4. 正方体的体积算棱长.cpp

一、二分

1. 实例

在猜数字的游戏中,对方想一个 1 − 100 1-100 1100 之间的数字,并且对方可以告诉你猜的数字是大了还是小了。这种情况,我们的思路就是找到想到数所在范围的平均值。例如:

范围猜值情况
1 − 100 1-100 1100 50 50 50
1 − 49 1-49 149 25 25 25
26 − 49 26-49 2649 37 37 37
26 − 36 26-36 2636 31 31 31
32 − 36 32-36 3236 34 34 34
32 − 33 32-33 3233 32 32 32
33 − 33 33-33 3333 33 33 33正确

也就是说,我们最多只需要用 7 7 7 次就绝对猜出来了。这是因为 2 7 > 100 2^7>100 27>100

2. 意义

二分是一种将查找区间逐渐缩小一半来快速定位目标元素的算法,其时间复杂度及其低,大约只有 O ( log ⁡ n ) O(\log n) O(logn),对于数列查找非常方便。

二、程序

1. 猜数字-次数.cpp

#include <iostream>
using namespace std;int n; // 想好的数 
int mid; // 猜测的数 
int cnt; // 统计猜测次数 
int l = 1, r = 100; // 范围指针 int main()
{cin >> n;while (true){mid = (l+r) / 2;cnt++; if (mid == n) // 猜中了 {break;}else if (mid < n) // 猜小了 {l = mid+1;}else // 猜大了 {r = mid-1;}}cout << cnt;return 0;
}

2. 二分查找.cpp

#include <iostream>
using namespace std;int n; // 数据个数 
int m; // 查找个数 
int x; // 查找的数据 
int a[100005]; // 存放数据的数组 int binarySearch(int x)
{int mid;int l = 1, r = n; // 查找指针 while (l <= r){mid = (l+r) / 2;if (a[mid] == x) // 猜中 {return mid;}else if (a[mid] < x) // 小了 {l = mid+1;}else // 大了 {r = mid-1;}}return -1; // 没找到 
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){cin >> a[i];}for (int i = 1; i <= m; i++){cin >> x;cout << binarySearch(x) << " ";}return 0;
}

3. 二维二分查找.cpp

提示:假如二维数组是有序的,寻找行的条件为: a [ m i d ] [ 1 ] ≤ x ≤ a [ m i d ] [ m ] a[mid][1]\le x\le a[mid][m] a[mid][1]xa[mid][m]

#include <iostream>
using namespace std;int n; // 行数 
int m; // 列数
int q; // 查找的次数 
int x; // 查找的数据 
int a[1005][1005]; // 存放数据的数组 int row(int n, int m, int x)
{int mid;int l = 1, r = n;  // 查找指针 while (l <= r){mid = (l+r) / 2;if (x >= a[mid][1] && x <= a[mid][m]) // 在该行 {return mid;}else if (x < a[mid][1]) // 太下面了 {r = mid-1;}else // 太上面了 {l = mid+1;}}return -1;
}int col(int R, int m, int x)
{int mid;int l = 1, r = m; // 查找指针 while (l <= r){mid = (l+r) / 2;if (a[R][mid] == x) // 找到 {return mid;}else if (a[R][mid] < x){l = mid+1;}else{r = mid-1;}}return -1;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}cin >> q;for (int i = 1; i <= q; i++){cin >> x;int R = row(n, m, x);if (R == -1){cout << "-1\n";continue;}int C = col(R, m, x);cout << R << " " << C << endl; }return 0;
}

4. 正方体的体积算棱长.cpp

提示:我们知道正方体的体积公式是 V = a 3 V=a^3 V=a3,因此反推出正方体的棱长公式是 a = V 1 3 a=V^{\frac{1}{3}} a=V31 也就是 a = V 3 a=\sqrt[3]{V} a=3V 。但是为了让精度更加高,我们就可以用二分查找了。

如果精度比较低,可以写出如下代码:

#include <iostream>
#include <cmath>
using namespace std;double V;int main()
{cin >> V;cout << pow(V, 1.0 / 3.0);return 0;
}

如果精度要求高一些,可以写出如下代码:

#include <iostream>
#include <cmath>
using namespace std;double V;
double mid;
double l = 0, r = 100;int main()
{cin >> V;while (r - l >= 0.000001) // 还未到指定精度 {mid = (l+r) / 2.0; if (pow(mid, 3) <= V) // 到达棱长区间 {l = mid;}else{r = mid; // 缩小范围 }}cout << l; // 输出左取值 return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Echarts图表使用

ECharts是一个用JS实现开源可视化库&#xff0c;它提供了丰富的图表类型和交互能力。使用户可以通过简单的配置生成各种各样的图表。 先安装ECharts图表直接下载echarts.min.js并用<script>标签引入也可以使用源代码版本echarts.js并用<script>标签引入&#xff0…

【前端】面试八股文——原型链

【前端】面试八股文——原型链 1. 什么是原型链&#xff1f; 在JavaScript中&#xff0c;每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;而原型本身又可能是另一个对象的原型。通过这种链式关系&#xff0c;可以实现属性和方法的继承&#xff0c;这就是…

华为机考入门python3--(29)牛客29-字符串加解密

分类&#xff1a;字符变换 知识点&#xff1a; 字符是字母 char.isalpha() 字符是小写字母 char.islower() 字符是数字 char.isdigit() b变C chr((ord(b) - ord(a) 1) % 26 ord(A)) 题目来自【牛客】 # 加密 def encrypt_string(s):result ""for ch…

【算法】决策单调性优化DP

文章目录 决策单调性四边形不等式决策单调性 形式1法1 分治法2 二分队列例题 P3515Solution 形式2例题 P3195Solution 形式3例题 CF833BSolution 形式4例题Solution 后话 决策单调性 四边形不等式 定义: 对于二元函数 w ( x , y ) w(x,y) w(x,y)&#xff0c;若 ∀ a , b , …

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

golang windows环境下集成swag的步骤

1、设置环境变量GOBIN%GOPATH%\bin 2、下载依赖包 go get github.com/swaggo/swag/cmd/swag 3、编译swag&#xff0c;进入目录 cd $GOPATH\pkg\mod\github.com\swaggo\swagv1.7.4\cmd\swag 执行&#xff1a;go install 执行结束后就会发现在GOBIN目录下生成了一个 swag.ex…

webpack编译过程

webpack编译过程 初始化 此阶段&#xff0c;webpack会将**CLI参数**、**配置文件**、**默认配置**进行融合&#xff0c;形成一个最终的配置对象。​ 对配置的处理过程是依托一个第三方库yargs完成的 ​ 此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备 ​…

Docker学习(3):镜像使用

当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 Docker Hub 公共镜像源下载。 一、列出镜像列表 可以使用 docker images 来列出本地主机上的镜像。 各个选项说明&#xff1a; REPOSITORY&am…

【Linux学习】进程

下面是有关进程的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. 进程的概念 1.1 进程与程序 1.2 进程号 2. 进程的状态 2.1 fork创建子进程 2.2 父子进程间的文件共享 3. 进程的诞生与终止 3.1 进程的诞生 3.2 进程的终止 1. 进…

使用docker commit创建新镜像

前言 我们知道&#xff0c;从docker-hub上拉取的镜像所创建的容器是最小版本的&#xff0c;比如ubuntu内部是没有vim编辑器的&#xff0c;我们需要自己手动安装&#xff0c;但是当我们安装后假如有人把我们的容器误删了&#xff0c;那么我们再次根据原始镜像创建的容器就没有了…

CCF20230501——重复局面

CCF20230501——重复局面 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;char a[101][64];int i,j;for(i0;i<n;i){for(j0;j<64;j){cin>>a[i][j];}}int temp0,flag1;for(i0;i<n;i){flag1;for(j0;j<…

MySQL---通用语法及分类

目录 一、SQL通用语法 二、 SQL分类 1.DDL 1.1 DDL数据库操作 1.2 DDL表操作---查询 1.3 DDL表操作---创建​编辑 1.4 DDL表操作---数据类型 1.5 DDL表操作---修改 1.6 DDL表操作---删除 1.7 DDL总结 2. 图形化界面工具DataGrip 2.1 创建 2.2 使用 3. DML 3.1 DML介绍 3.2 DM…

521源码-免费源码下载-最新个人主页、个人引导页、网站导航页、引流页源码

这款源码采用HTML、CSS和JavaScript的组合&#xff0c;为您打造了一个既美观又实用的个人主页。通过简单的记事本工具打开源码文件&#xff0c;您可以轻松进行内容、文字以及样式上的修改&#xff0c;以满足您的个性化需求。 源码文件包含了完整的HTML结构、CSS样式表和JavaSc…

【深度学习实战—7】:基于Pytorch的多标签图像分类-Fashion-Product-Images

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、数据…

[Linux]Crond任务调度以及at任务调度

一.crond任务定时调度 crond是反复检测执行的&#xff0c;一个任务结束后&#xff0c;在所规定的时间之后会再次执行 crontab 指令可以给系统分配定时任务 crontab -e 进入编辑页面&#xff0c;设定任务 crontab -l 查看已有定时任务 crontab -r 删除所有任务 编辑时&#xff…

vue3全局封装table分页

1.封装element-plus table分页 <template><el-pagination:page-sizes"pageSizes"v-model:current-page"currentPage"v-model:page-size"pageSize":total"totals"size-change"handleSizeChange"current-change&quo…

MySQL - 信贷业务报表

表结构与字段解释 注册表 u_user id&#xff1a;自增主键&#xff0c;唯一标识用户。username&#xff1a;用户名。mobile&#xff1a;手机号。password&#xff1a;用户密码。nickname&#xff1a;用户昵称。role_type&#xff1a;角色类型&#xff08;-1&#xff1a;普通用…

FreeRTOS 源码概述

FreeRTOS 目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下: 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件 Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Middlewares\Third_Party…