二分

news2024/9/21 2:44:07

二分法:二分搜索法

不断缩小解可能存在的范围,从而求得问题最优解的方法

二分法的时间复杂度为O(logn)

二分题目主要分为二分查找二分答案,二分类型分为整数二分实数域上二分

整数二分

在闭区间[left,right]之间,不断二分,直到left = right时,循环结束

模板1:区间[left,right]被划分成[left, mid]和[mid + 1, right]

求等于key的位置以及大于key的第一个位置

模板2:区间[left, right]被划分成[left, mid - 1]和[mid, right]

求小于key的第一个位置
import org.junit.Test;
public class IntegerDichotomous {
    @Test
    public void test() {
        int[] arr = new int[]{2,2,4,6,8,9};
        System.out.print(template1(arr,3));
    }

    //模板1:区间[left,right]被划分成[left, mid]和[mid + 1, right],mid归右边界
//    key大于等于时left=mid+1,key小于时right=mid;
//    mid=right,left=mid+1
    //求等于key的位置以及大于key的第一个位置
    public static int template1(int[] arr, int key) {
        int left = 0, right = arr.length - 1;
        while (left < right) {
            int mid = (left + right) / 2;//向下取整
            if (arr[mid] >= key) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return right;
    }

    //模板2:区间[left, right]被划分成[left, mid - 1]和[mid, right],mid归左边界
    //arr[mid]=key,left=mid,right=mid-1
    //求小于key的第一个位置
    public static int template2(int[] arr, int key) {
        int left = 0, right = arr.length - 1;
        while (left < right) {
            int mid = (left + right + 1) / 2;//向上取整
            if (arr[mid] <= key) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return right;
    }
}

浮点数二分

浮点数二分没有边界问题,对于两个数之间来说,一定是有值的

  • 整数二分:4和5之间没有值
  • 浮点数二分:4~4.5,4~4.25,4~4.125,4~4.0625,........  能够一直取数,那么我们就需要一个精度确定什么时候不再取数

确定精度eps,确定二分终止条件

tip:条件要求保留k位小数,精度eps=1e^(-k-2),表示1*10的负(k+2)次方

        为什么是k+2不是k?

        如果是k,那么会有进位的问题。例如0.002~0.006保留两位小数,0.006进位0.01,0.002不进位,进位后二者之差0.01,但实际上二者差0.004。为了数据的准确性,eps向后加两位

例:给定一个浮点数,求这个浮点数的平方根,保留2位小数

import org.junit.Test;

public class FloatDichotomous {
    @Test
    public void test(){
        double key = 100.00;
        floatDichotomous(key);
    }

    public static void floatDichotomous(double key){
        double left= 0,right = key;//根据题目取数,如果题目有范围,根据题目范围取数
        while (right - left > 1e-4){
            double mid = (left + right) / 2;
            if(mid * mid >= key){
                right = mid;
            }else{
                left = mid;
            }
        }
        System.out.printf("%.2f\n", left);
    }
}

例:在-10000~10000的范围内给定一浮点数,求该浮点数的三次方根,left和right范围取-22~22(22*22*22=10648)

二分查找

上述示例,我们可以考虑到在结束时

条件1:arr[mid] = key,此时是寻找数组中的某个数

条件2:arr[mid] < key < arr[mid+1],left = mid+1,right = mid

返回left为寻找数组中大于key的第一个数,返回right为寻找数组中小于key的第一个数

条件3:arr[mid-1] < key < arr[mid],left = mid ,right = mid-1

返回left为寻找数组中大于key的第一个数,返回right为寻找数组中小于key的第一个数

因此我们可以根据题目条件调整代码

条件4:统计key在数组中出现的次数

寻找第一个大于key元素的下标upper,第一个小于key的元素的下标lower

次数num = upper - lower

import org.junit.Test;

public class GetNumByDIchotomy {
    @Test
    public void test() {
        int[] arr = new int[]{1,1,1,5,5,6,7,9,11};
        System.out.println(getUpper(arr,1)-getLower(arr,1));
    }

    //查找第一个大于key的位置
    public static int getUpper(int[] arr, int key) {
        int l = 0, r = arr.length - 1;
        int upper = 0;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (arr[mid] > key) {
                upper = mid;
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return upper;
    }

    //查找第一个大于或等于key的数的位置
    public static int getLower(int[] arr, int key) {
        int l = 0, r = arr.length - 1;
        int lower = 0;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (arr[mid] >= key) {
                lower = mid;
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return lower;
    }
}

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

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

相关文章

【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python解码张三的法外狂徒之旅,揭秘视频背后的真相!【含jS逆向解密】

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 传说中&#xff0c;有人因为只是远远的看了一眼法外狂徒张三就进去了&#x1f602; 我现在是获取他视频&#xff0c;岂不是直接终生了&#x1f929; 网友&#xff1a;赶紧跑路吧 &#x1f60f; 好了话不多说&#xff…

独立站是如何打造品牌形象的?

当你决定做独立站的时候&#xff0c;一切都是从0开始&#xff0c;用户的信任也需要一点点建立。这就涉及到一个老生常谈的问题&#xff1a;如何为你的独立站打造一个更好的品牌形象&#xff1f; 无论你的产品是大众款还是小众商品&#xff0c;品牌所体现出的专业度&#xff0c…

【点选验证码】生成点选验证码图片

生成点选验证码图片 参考博客&#xff1a;https://blog.csdn.net/sinat_39629323/article/details/121989609 from tqdm import tqdm from PIL import Image, ImageDraw, ImageFont, ImageOps import shutil,os import numpy as np import cv2 import math import random fil…

python-异常处理

# try : # print(name) # except NameError: # print("有问题")# # try: # 1 / 0 # except ZeroDivisionError as ze: # print("xxxx", ze) # except NameError as ne: # print("666",ne) # else: # print("123&qu…

Domain Cluster Model

Introduction Domain Cluster Model 3.0 Background of Domain Management  领域管理背景 Common Framework 通用框架Architecture & Synergy Analysis 体系结构与协同分析Demand & Project Support 需求和项目支持Same Understanding between BU & IT BU和IT之间…

2 halcon ROI技术

文章目录 ROI 技术代码 ROI 技术 ROI 技术允许你在图像中定义一个特定的区域&#xff0c;并将该区域应用于后续的图像处理和分析任务。以下是使用 Halcon 实现 ROI 技术的一般步骤&#xff1a; 创建 ROI 对象&#xff1a;首先&#xff0c;你需要创建一个 ROI 对象来定义感兴趣…

使用 Python 自动备份 SQL 数据库

◆ 背景 在本文中&#xff0c;我们将深入探讨如何利用Python实现自动备份SQL数据库&#xff0c;以达到备份过程更加高效、简便和低出错率的目的。借助Python自动备份SQL数据库的方法&#xff0c;您能够节省时间、降低错误风险&#xff0c;并且保障数据始终得到有效保护。 定期…

超导体的概念及其用处

目录 1.什么是超导体 2.研究超导体的意义 3.常温超导体 4.韩国超导 1.什么是超导体 超导体是指在低温下具有零电阻和完全排斥磁场的材料。当超导体被冷却到其临界温度以下&#xff0c;电流可以在其内部无阻碍地流动&#xff0c;且磁场被完全排斥出超导体的表面&#xff0c;这…

移动端开发框架mui之源代码及 examples 下载

MUI版本号&#xff1a; v3.7.3 下载地址1&#xff1a; 百度网盘&#xff08;备份&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1jqBNQFNHPbzqUYLJ2Hjgmw?pwdafk9 提取码&#xff1a;afk9 下载地址2&#xff1a; mui.js 及 examples 下载 - 码农之家

STM32 SPI学习

SPI 串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。 SCK时钟信号由主机发出。 SPI接口主要应用在存储芯片。 SPI相关引脚&#xff1a;MOSI&#xff08;输出数据线&#xff…

myBatis报错:Parameter index out of range (3 > number of parameters, which is 2).

【问题描述】&#xff1a; 今天在写mybatis的动态判断语句时&#xff0c;出现报错信息&#xff1a;&#xff08;报错信息从下往上看&#xff09; Parameter index out of range (3 &#xff1e; number of parameters, which is 2). 我们在mapper.xml文件中写动态SQL&#x…

【Terraform学习】Terraform配置变量(Terraform配置语言学习)

配置变量 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中&#xff0c;单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分&#xff0c;为角色选择可信实体类型&#xff1a; AWS 服务 使用案例:EC2 单击下一步 添加权限&#xff1a;现在&#xff0c…

Rviz2的自定义插件开发基础知识

1. 简介 Rviz中有不同类型的插件&#xff0c;每个插件都必须具有相应的基本类型&#xff0c;才能被RViz识别 plugin typebase typeDisplayrviz_common::DisplayPanelrviz_common::PanelToolrviz_common::ToolFrames transformation libraryrviz_common::transformation::Fram…

有哪些虚拟机好用?并且对电脑没有伤害

在当今数字化时代&#xff0c;虚拟化技术越来越受到人们的关注和使用。虚拟机作为一种强大的工具&#xff0c;可以在一台计算机上模拟多个独立的操作系统环境&#xff0c;为用户提供了灵活性和便利性。然而&#xff0c;有人担心使用虚拟机可能会对电脑造成损害&#xff0c;尤其…

多普勒气泡监测与分级方法

Ultrasound detection of vascular decompression bubbles the influence of new technology and considerations on bubble load 多普勒气泡检测方法&#xff1a; 听觉多普勒超声监测法视觉二维超声成像谐波超声成像&#xff08;2的变种&#xff09; 多普勒气泡分级方法&…

objectarx编译Debug版arx遇到的问题

错误一链接错误 1>pietdoginterface_s.lib(Msg.obj) : error LNK2001: 无法解析的外部符号 “class ATL::CTraceCategory ATL::atlTraceException” (?atlTraceExceptionATL3VCTraceCategory1A) 1>pietdoginterface_s.lib(Msg.obj) : error LNK2001: 无法解析的外部符号…

【洁洁送书第二期】Python机器学习:基于PyTorch和Scikit-Learn

前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来&#xff0c;机器学习和深度学习迅猛发展&#xf…

Element-UI 10个技巧

el-scrollbar 滚动条 看到这个组件是不是有点陌生&#xff0c;陌生就对了&#xff0c;因为它从来没有出现在 element 官网上&#xff08;估计是性能问题&#xff09;&#xff0c;但好东西怎么能藏着掖着&#xff0c;来上效果图。 是不是比原生的滚动条美观多了&#xff0c;使用…

【2】-第一个Locust脚本

创建&执行第一个locustfile.py 在ide中创建我们的loucst项目&#xff0c;并创建第一个测试脚本&#xff0c;代码如下 ## /mylocust/locustfiles/first_locustfile.py import os from locust import HttpUser, task# 继承locust的HttpUser类&#xff0c;这样我们就可以使用…