【二分查找】【浮点数的二分查找】【二分答案查找】

文章目录

  • 前言
  • 一、二分查找(Binary Search)
  • 二、浮点数的二分查找
  • 三、二分答案
  • 总结


前言

今天记录一下基础算法之二分查找


一、二分查找(Binary Search)

二分查找(Binary Search)是一种在有序数组中查找目标值的算法。它的原理是通过将数组分成两半并检查目标值是否在数组的中间,从而不断缩小搜索范围,直到找到目标值或确定目标值不存在为止

#include <iostream>
#include <vector>int binarySearch(const std::vector<int>& arr, int target) {int left = 0;int right = arr.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;// 如果目标值在中间,则返回if (arr[mid] == target)return mid;// 如果目标值比中间值小,则在左半部分继续搜索else if (arr[mid] > target)right = mid - 1;// 如果目标值比中间值大,则在右半部分继续搜索elseleft = mid + 1;}// 如果未找到目标值,则返回 -1return -1;
}int main() {std::vector<int> arr = {1, 3, 5, 7, 9, 11, 13, 15, 17};int target = 11;int result = binarySearch(arr, target);if (result != -1)std::cout << "目标值 " << target << " 在索引 " << result << " 处找到。" << std::endl;elsestd::cout << "目标值 " << target << " 未找到。" << std::endl;return 0;
}

二、浮点数的二分查找

浮点数的二分查找与整数的二分查找非常相似,但需要处理浮点数比较时可能出现的精度问题。

#include <iostream>
#include <vector>
#include <cmath>// 定义一个足够小的值,用于比较浮点数的精度
const double EPSILON = 1e-9;int binarySearch(const std::vector<double>& arr, double target) {int left = 0;int right = arr.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;// 如果目标值在中间,则返回if (std::abs(arr[mid] - target) < EPSILON)return mid;// 如果目标值比中间值小,则在左半部分继续搜索else if (arr[mid] > target)right = mid - 1;// 如果目标值比中间值大,则在右半部分继续搜索elseleft = mid + 1;}// 如果未找到目标值,则返回 -1return -1;
}int main() {std::vector<double> arr = {1.0, 3.2, 5.5, 7.7, 9.8, 11.0, 13.3, 15.5, 17.6};double target = 11.0;int result = binarySearch(arr, target);if (result != -1)std::cout << "目标值 " << target << " 在索引 " << result << " 处找到。" << std::endl;elsestd::cout << "目标值 " << target << " 未找到。" << std::endl;return 0;
}

三、二分答案

二分答案(Binary Search for Answer)是一种解决优化问题的常见方法,其中问题的解是一个实数或整数,并且有一个单调函数关系。在这种情况下,我们可以使用二分查找来快速找到满足特定条件的最优解。
check 函数用于检查是否满足条件,binarySearch 函数使用二分搜索来找到满足条件的最小值。

#include <iostream>
#include <functional>using namespace std;// 二分答案
double binary_search_answer(double left, double right, function<bool(double)> predicate) {const double EPSILON = 1e-9; // 精度控制while (right - left > EPSILON) {double mid = left + (right - left) / 2;if (predicate(mid)) {right = mid;} else {left = mid;}}return left;
}// 检查函数:判断 x 是否大于 5
bool check(double x) {return x > 5;
}int main() {// 在区间 [0, 10] 中找到满足 is_greater_than_five 的最小值double result = binary_search_answer(0, 10, check);cout << "满足条件的最小值为: " << result << endl;return 0;
}

正好小唐在昨天写小白赛题目的时候遇到了一个题用到了二分答案,正好当成例题如下:
在这里插入图片描述

这个思路就是找到一个最小正整数x,是个查找问题,查找的规律满足是一个算术不等式,并且该算术不等式满足函数的单调性,那么我们就可以使用二分答案去解决这个问题,cheak函数为满足算术不等式,查找范围为1到一个很大的数。那么我们就可以写出如下代码:

#include <iostream>
#include <cmath>using namespace std;bool check(int x, int k, int m) {return sqrt(x) + floor(log(x) / log(k)) - m > 0;
}int binary_search(int k, int m) {int left = 1;long long right = 10000000000LL; // 根据题目要求设定搜索范围while (left < right) {int mid = left + (right - left) / 2;if (check(mid, k, m)) {right = mid;} else {left = mid + 1;}}return left;
}int main() {int t;cin >> t;int k[t][2];for (int i = 0; i < t ; ++i) {cin >> k[i][0] >> k[i][1]; }for (int i = 0; i < t; ++i) {cout << binary_search(k[i][0], k[i][1]) << endl;}return 0;
}

总结

以上就是对二分查找,二分浮点查找,以及二分答案的总结!唐怡佳继续加油!要多多复习回来看看哦!

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

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

相关文章

Nodejs+vue图书阅读评分个性化推荐系统

此系统设计主要采用的是nodejs语言来进行开发&#xff0c;采用 vue框架技术&#xff0c;对于各个模块设计制作有一定的安全性&#xff1b;数据库方面主要采用的是MySQL来进行开发&#xff0c;其特点是稳定性好&#xff0c;数据库存储容量大&#xff0c;处理能力快等优势&#x…

数字热潮:iGaming 能否推动加密货币的普及?

过去十年&#xff0c;iGaming&#xff08;互联网游戏&#xff09;世界有了显著增长&#xff0c;每月有超过一百万的新用户加入。那么&#xff0c;这一主流的秘密是什么&#xff1f;让我们在本文中探讨一下。 领先一步&#xff1a;市场 数字时代正在重新定义娱乐&#xff0c;iG…

MySQL运维实战(7.2) MySQL复制server_id相关问题

作者&#xff1a;俊达 主库server_id没有设置 主库没有设置server_id Got fatal error 1236 from master when reading data from binary log: Misconfigured master - server_id was not set主库查看server_id mysql> show variables like server_id; ----------------…

如何在本地电脑部署HadSky论坛并发布至公网可远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

Repeater:创建大量类似项

Repeater 类型用于创建大量类似项。与其它视图类型一样&#xff0c;Repeater有一个model和一个delegate。 首次创建Repeater时&#xff0c;会创建其所有delegate项。若存在大量delegate项&#xff0c;并且并非所有项都必须同时可见&#xff0c;则可能会降低效率。 有2种方式可…

【ubuntu】永久修改主机名

文章目录 1. 问题描述2. 解决方案 1. 问题描述 主机名过长&#xff08;后面的部分&#xff09; 2. 解决方案 查看主机名详情 hostnamectl修改指定主机名 hostnamectl set-hostname ubuntu2204 --static登出重进即可

冯诺依曼体系结构 与 操作系统

一、冯诺依曼体系结构 深入理解冯诺依曼体系结构 计算机的出现就是为了解决实际问题, 所以把问题交给计算机&#xff0c;计算机经过处理&#xff0c;得到一个结果反馈给我们&#xff0c;所以这中间就必然涉及到了输入设备&#xff0c;中央处理器(包括运算器和控制器)和输出设备…

【HarmonyOS】低代码开发—使用低代码开发服务卡片

DevEco Studio还支持使用低代码开发功能开发服务卡片&#xff0c;目前只支持JS语言&#xff0c;且compileSdkVersion必须为7或以上。 下面以创建一个新的服务卡片为例进行说明。 1.打开一个工程&#xff0c;创建服务卡片&#xff0c;创建方法包括如下两种方式&#xff1a; 选…

网络安全“三保一评”深度解析

“没有网络安全就没有国家安全”。近几年&#xff0c;我国法律法规陆续发布实施&#xff0c;为承载我国国计民生的重要网络信息系统的安全提供了法律保障&#xff0c;正在实施的“3保1评”为我国重要网络信息系统的安全构筑了四道防线。 什么是“3保1评”&#xff1f; 等保、分…

计算机网络-网络互联

文章目录 网络互联网络互联方法LAN-LAN&#xff1a;网桥及其互连原理使用网桥实现LAN-LAN使用交换机扩展局域网使用路由器连接局域网 LAN-WANWAN-WAN路由选择算法非自适应路由选择算法自适应路由选择算法广播路由选择算法&#xff1a;分层路由选择算法 网络互联 网络互联是指利…

我的128创作纪念日

目录 学习成长机遇个人数据一览榜单认可日常2024憧憬和规划创作纪念日总结 学习成长机遇 账号创建已经快9年了&#xff0c;以前一直在个人网站和简书上写文章&#xff0c;在CSDN真正写文竟然在2023年10月20&#xff0c;至今才128天&#xff0c;不过获得的数据还算可以&#xff…

算法-计算机基础知识

1&#xff0c;坐标系与数学不同&#xff0c;x轴向下&#xff0c;y轴向右 2.案例&#xff1a;螺旋矩阵 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<Integer> spiralOrder(int[][] matrix) { List<Integer&…

探索视频数据的无限可能,Sora引领生成模型新纪元的技术解读

最近几天&#xff0c;open AI 推出的新的文生视频模型sora再次惊艳AI界&#xff0c;Sora模型近期发布的底层技术报告引起了广泛关注。作为前沿的视频生成与编辑工具&#xff0c;Sora究竟有何独特之处&#xff1f;本文就基于其几乎是文档来对其技术原理进行解读。下面让我们一起…

12. Springboot集成Dubbo3(三)Dubbo-Admin

目录 1、前言 2、安装 2.1、下载Dubbo-admin 2.2、修改配置 2.3、编译前端 2.4、访问 2.5、加载自己的服务 2.6、服务测试 2.7、其他 3、小结 1、前言 Dubbo Admin是用于管理Dubbo服务的基于Web的管理工具。Dubbo Admin提供了一个用户友好的界面&#xff0c;用于在分…

面试经典150题【21-30】

文章目录 面试经典150题【21-30】6.Z字形变换28.找出字符串中第一个匹配项的下标68.文本左右对齐392.判断子序列167.两数之和11.盛最多水的容器15.三数之和209.长度最小的子数组3.无重复字符的最长子串30.串联所有单词的子串 面试经典150题【21-30】 6.Z字形变换 对于“LEETC…

js滑动窗口算法

滑动窗口算法&#xff08;Sliding Window Algorithm&#xff09;是一种用于解决数组或字符串的子串问题的有效算法。其核心思想是通过维护一个窗口&#xff0c;根据问题的要求移动窗口的左右边界&#xff0c;从而在窗口内部找到符合条件的子串。 一般步骤如下&#xff1a; 初…

仿12306校招项目业务四(乘车人模块)

乘车人表结构 分库分表策略 乘车人的数据严重依赖于用户数据。每个用户至少需要有一个对应的乘车人&#xff0c;即自己本人。当然&#xff0c;也有可能是其他人&#xff0c;因为允许用户注册账号后为他人购票的情况。这种关联确保了用户和乘车人之间的正确映射&#xff0c;使系…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存&#xff0c;看下图 我们先声明出指针p和指针q&#xff0c;还有指针head&#xff08;主要用于return上而已&#xff09;&#xff0c;然后进行一系列操作&#xff0c…

从源码学习单例模式

单例模式 单例模式是一种设计模式&#xff0c;常用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这意味着无论在程序的哪个地方&#xff0c;只能创建一个该类的实例&#xff0c;而不会出现多个相同实例的情况。 在单例模式中&#xff0c;常用的实现方式包括懒汉…

【论文精读】DALL·E2

摘要 CLIP被证明其可以学习到鲁棒的图像特征&#xff0c;可以有效的捕获图像的语义和风格&#xff0c;且具有很强的zero-shot能力。另外&#xff0c;Diffusion是目前最优的生成式框架&#xff0c;其推动了图像、视频生成任务的最先进性能。Classifier-Free Diffusion指导技术以…