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

文章目录

  • 前言
  • 一、二分查找(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;
        // 如果目标值比中间值大,则在右半部分继续搜索
        else
            left = mid + 1;
    }

    // 如果未找到目标值,则返回 -1
    return -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;
    else
        std::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;
        // 如果目标值比中间值大,则在右半部分继续搜索
        else
            left = mid + 1;
    }

    // 如果未找到目标值,则返回 -1
    return -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;
    else
        std::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.mfbz.cn/a/408593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1 Nacos数据持久化方式

Nacos 支持两种数据持久化方式&#xff0c;一种是利用内置的数据库&#xff0c;另一种是利用外置的数据源。 1、内置数据库支持 Nacos 默认内置了一些数据存储解决方案&#xff0c;如内嵌的 Derby 数据库。 这种内置方式主要用于轻量级或测试环境。 2、外置数据库支持 对于生…

【RN】学习使用 Reactive Native内置UI组件

简言 当把导航处理好后&#xff0c;就可以学习使用ui组件了&#xff08;两者没有先后关系&#xff0c;个人习惯&#xff09;。 在 Android 和 iOS 开发中&#xff0c;一个视图是 UI 的基本组成部分&#xff1a;屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚…

如何使用逻辑回归处理多标签问题?

逻辑回归处理多分类 1、背景描述2、One vs One3、One vs Rest4、从Sigmoid到Softmax的推导 1、背景描述 逻辑回归本身只能用于二分类问题&#xff0c;如果实际情况是多分类的&#xff0c;那么就需要对模型进行一些改动。下面介绍三种常用的将逻辑回归用于多分类的方法 2、One …

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器&#xff0c;其任务是区分目标和周围环境。为了应对自然图像变化&#xff0c;此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

用Python实现创建十二星座数据分析图表

下面小编提供的代码中&#xff0c;您已经将pie.render()注释掉&#xff0c;并使用了pie.render_to_file(十二星座.svg)来将饼状图渲染到一个名为十二星座.svg的文件中。这是一个正确的做法&#xff0c;如果您想在文件中保存图表而不是在浏览器中显示它。 成功创建图表&#xf…

嵌入式软件分层设计的思想分析

“嵌入式开发&#xff0c;点灯一路发” 那今天我们就以控制LED闪烁为例&#xff0c;来聊聊嵌入式软件分层: ——————————— | | | P1.1 |-----I<|--------------<| | | | P2.1 |-------------/ ---------…

MyBatis的⾼级映射及延迟加载

MyBatis的⾼级映射及延迟加载 一、多对一1.方式一&#xff1a;级联属性映射2.方式二&#xff1a;association3.方式三&#xff1a;分步查询 二、一对多1.方式一&#xff1a;collection2.方式二&#xff1a;分步查询 三、延迟加载&#xff08;懒加载&#xff09;1.分步查询的优点…

【C++】类和对象之拷贝构造函数篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解&#xff0c;接下来继续往后看拷…

uvloop,一个强大的 Python 异步IO编程库!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是uvloop库&#xff1f; 安装uvloop库 使用uvloop库 uvloop库的功能特性 1. 更…

nodejs+vue+ElementUi废品废弃资源回收系统

系统主要是以后台管理员管理为主。管理员需要先登录系统然后才可以使用本系统&#xff0c;管理员可以对系统用户管理、用户信息管理、回收站点管理、站点分类管理、站点分类管理、留言板管理、系统管理进行添加、查询、修改、删除&#xff0c;以保障废弃资源回收系统系统的正常…

【Linux】部署单机项目(自动化启动)

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.部署项目 一.jdk安装 1.上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2.解压安装包 防止后面单个系列解压操作&#xff0c;我这边就直接将所有的要用的全部给解压&#xff0c;如下图注…

2024 高级前端面试题之 计算机通识(基础) 「精选篇」

该内容主要整理关于 计算机通识&#xff08;基础&#xff09; 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 计算机基础精选篇 一、网络1.1 UDP1.2 TCP1.3 HTTP1.4 DNS 二、数据结构2.1 栈2.2 队列2.3 链表2.4 树2.5 堆 三、算法3.1 时…

计算机毕业设计-SSM课程题库管理系统 18655(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

毕业设计&#xff08;论文&#xff09; SSM课程题库管理系统 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成日期…

vSphere高可用架构---HA简介

1.高可用性 2.不同级别的高可用&#xff1a; 1&#xff09;应用程序级别&#xff0c;2&#xff09;操作系统级别&#xff0c;3&#xff09;虚拟化级别&#xff0c;4&#xff09;物理层级别 不同级别的高可用举例&#xff1a; 应用程序级别的高可用性。例如&#xff1a;Oracl…

使用C++和SFML库创建2D游戏

FML&#xff08;Simple and Fast Multimedia Library&#xff09;是一个跨平台的C库&#xff0c;用于开发2D游戏和多媒体应用程序。它提供了许多功能&#xff0c;包括图形、声音、网络、窗口管理和事件处理等。 ———————————————不怎么完美的分割线——————…

Spring Boot 手写starter!!!

原因&#xff1a;为什么要手写starter&#xff1f;&#xff1f;&#xff1f; 原因&#xff1a;简化功能。 实例&#xff1a;以分页为例&#xff1a;写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…

利用Dynamo为家具族三维截图并导入到明细表

前几天我在朋友圈发了一个小视频&#xff0c;是利用Dynamo为家具族截图&#xff0c;并将截图添加到族参数&#xff0c;以便于在图纸中显示族的样子。效果如下&#xff1a; 此处为语雀视频卡片&#xff0c;点击链接查看&#xff1a; 利用Dynamo为家具族三维截图并导入到明细表 …

TF-IDF,textRank,LSI_LDA 关键词提取

目录 任务 代码 keywordExtract.py TF_IDF.py LSI_LDA.py 结果 任务 用这三种方法提取关键词&#xff0c;代码目录如下&#xff0c; keywordExtract.py 为运行主程序 corpus.txt 为现有数据文档 其他文件&#xff0c;停用词&#xff0c;方法文件 corpus.txt 可以自己…

【统计分析数学模型】聚类分析: 系统聚类法

【统计分析数学模型】聚类分析&#xff1a; 系统聚类法 一、聚类分析1. 基本原理2. 距离的度量&#xff08;1&#xff09;变量的测量尺度&#xff08;2&#xff09;距离&#xff08;3&#xff09;R语言计算距离 三、聚类方法1. 系统聚类法2. K均值法 三、示例1. Q型聚类&#x…

udp服务器【Linux网络编程】

目录 一、UDP服务器 1、创建套接字 2、绑定套接字 3、运行 1&#xff09;读取数据 2&#xff09;发送数据 二、UDP客户端 创建套接字&#xff1a; 客户端不用手动bind 收发数据 处理消息和网络通信解耦 三、应用场景 1、服务端执行命令 2、Windows上的客户端 3…