【算法学习系列】06 - 利用二分法查找有序数组中的某个数 num

news2024/11/25 10:57:47

文章目录

  • 二分法
    • 说明
    • 实现
  • 二分法验证
    • 实现暴力算法
    • 对数器使用
    • 验证结果

二分法

说明


二分法是一种常用的算法,也称为折半查找或二分查找。它适用于已经有序的数组中,通过将数组从中间划分成两个部分,每次根据目标值与中间值的大小比较来确定下一步的查找范围,直到找到目标值或者确定不存在为止。

二分法的时间复杂度为 O(log n),较低的时间复杂度让它成为了解决大规模数据搜索效率较高的算法之一。

实现


根据说明,二分法实现代码如下:

	// 二分法:从有序数组 arr 中找到 num
    private boolean findNum(int[] arr, int num){
        if (arr == null || arr.length == 0){
            return false;
        }
        // 示例 [1, 2, 3, 4, 5, 5, 8]
        int L = 0,R = arr.length - 1;
        while (L <= R){
            int middle = (L + R) / 2;
            if (arr[middle] == num){
                return true;
            }else if (arr[middle] < num){
                L = middle + 1;
            }else {
                R = middle - 1;
            }
        }
        return false;
    }

二分法验证


下面会使用对数器来进行验证。如果不了解对数器的同学可以先阅读 【算法学习系列】05 - 对数器的说明与使用 一文了解对数器的相关知识。

实现暴力算法


暴力算法 B 能保证结果肯定正确,但是不保证时间复杂度或者是执行效率,主要是用来跟实现的算法 A 进行结果比对。

实现代码如下:

	// 暴力算法,保证算法结果肯定正确
    private boolean test(int[] sortedArr, int num){
        for (int value : sortedArr){
            if (value == num){
                return true;
            }
        }
        return false;
    }
  • 返回值为 true 表示有序数组 sortedArr 中存在 num
  • 返回值为 false 表示有序数组 sortedArr 中不存在 num

对数器使用


验证算法的测试代码实现如下:

	private void testFindNum(){
        int maxLen = 10;
        int maxValue = 1000;
        int testCount = 100000;
        boolean isCorrect = true;

        for (int i = 0;i < testCount;i++){
            // 生成随机长度和随机值的数组
            int[] randomArr =  createRandomArr(maxLen, maxValue);
            // 进行选择排序
            SortUtil.selectionSort(randomArr);
            // 随机生成一个数 num
            int num = (int)((maxValue + 1) * Math.random()) - (int)(maxValue * Math.random());
            // 跟暴力算法 test(int[] sortedArr, int num) 的值进行比对
            if (test(randomArr, num) != findNum(randomArr, num)){
                isCorrect = false;
                break;
            }
        }

        System.out.println(isCorrect ? ":> 算法正确!" : ":> 算法出错了!");
    }

这里进行了十万次随机样本测试。

首先随机生成一个无序数组 randomArr ,然后对 randomArr 进行选择排序,保证其有序;再随机生成一个数 num

然后使用有序数组 randomArrnum 分别给到自己实现的算法 A 和暴力算法 B 当做输入,并进行两个算法的输出结果比对。

如果在大样本随机下,二者比对结果都一致,说明实现的二分算法正确;反之则说明算法不正确。

注:上面涉及的排序算法和随机数组生成函数请阅读【算法学习系列】05 - 对数器的说明与使用 一文查看。

验证结果


运行程序,输出结果如下图示:

在这里插入图片描述

  • 由上图打印可知,二分算法验证正确。

“Peace Love Respect”

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

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

相关文章

基于InVEST模型的人类活动、重大工程生态成效评估、论文写作

查看原文>>>基于生态系统服务&#xff08;InVEST模型&#xff09;的人类活动、重大工程生态成效评估、论文写作 【学习目标】&#xff1a; 1) 采用InVEST模型&#xff0c;掌握产水&#xff08;包括水源涵养&#xff09;、碳存储&#xff08;包括固碳&#xff09;、土…

2023年最新苹果账号更改/注册为美区账号及免国外支付购买和充值美区App Store礼品卡教程

平时大家在使用IPhone手机时,应该有遇到软件明明是在App Store里上架的,但自己无论如何也搜索不到的情况吧!这种就是因为应用没有上架到你苹果账号所在的国家地区才导致的搜不到无法下载。比如:部分的新闻类、代[过滤]理类、游戏类应用以及Chat GPT等都无法在国区账号中搜索…

基于GPS+IMU的卡尔曼滤波融合定位算法MATLAB代码

资源地址&#xff1a; 基于GPSIMU的卡尔曼滤波融合定位算法MATLAB代码资源-CSDN文库 主要内容&#xff1a; 基于GPSIMU的卡尔曼滤波融合定位算法仿真,其中惯导用来进行状态预测,GPS用来滤波矫正&#xff0c;用于GPSIMU的卡尔曼滤波融合定位算法算法编程学习&#xff01;&…

如何以零停机时间或最少停机时间更新 Docker 容器,来确保应用程序持续可用

在现代应用程序开发和部署中&#xff0c;容器化技术已经成为一种常见的选择。Docker 容器的优势在于其轻量级、可移植性和可扩展性&#xff0c;但在更新容器时可能会面临停机时间的问题。本文将详细介绍如何以零停机时间或最少停机时间更新 Docker 容器&#xff0c;以确保应用程…

RedisTemplate

jedis是redis官网推荐的一个面向java客服端&#xff0c;库文件实现了对各类API进行封装调用。 lettuce是一个redis的驱动包&#xff0c;Lettuce译为生菜。 jedis和lettuce都是redis的客户端&#xff0c;他们可以连接redis服务器.但是在springbot2.0以后都是使用的Lettuce客户…

ImageCombiner是一个专门用于Java服务端图片合成的工具

1.1 项目背景 最近公司上了不少传播方面的需求&#xff0c;免不了合成各种营销图片&#xff0c;图片合成本身并不是什么高深的技术&#xff0c;但用底层api去搞确实繁琐&#xff0c;于是抽时间封装了一个小工具&#xff0c;初衷是解放生产力&#xff0c;后来发现挺好使&#x…

Unity之OpenXR+XR Interaction Toolkit实现 VR控制第一人称角色模型动画

前言 我们在开发VR项目时,有时会有第一人称视角的需求,即我们自己带上VR头显,能够看到自己的身体,如果模拟一些人物触电死亡,使用工具动画之类的需求,那么VR控制第一人称视角就比较实用了。 我们今天就来介绍一下如何实现VR设备控制第一人称: 1.角色手部跟随手柄移动和…

ERROR: No matching distribution found for ray解决办法

报错&#xff1a; from ray.rllib.algorithms.apex_dqn import ApexDQN ModuleNotFoundError: No module named ray 解决办法&#xff1a; pip install "ray[rllib]" -i https://pypi.tuna.tsinghua.edu.cn/simple

【网络技术】防火墙配置单机旁挂模式

组网需求 某公司网络部署Agile Controller服务器组&#xff0c;同时以旁挂方式部署FW于网络出口&#xff0c;如图1所示&#xff0c;要求&#xff1a; •用户角色不同&#xff0c;能访问的网络资源也不同&#xff08;在Agile Controller服务器中配置&#xff09;。 •用户角色…

k8s 中 pod 是如何做到网络共享的

前言 在k8s中, pod是编排的最小单位, 在同一个pod中, 容器之间能够共享hostname network 等内容. 共享network, 简单说就是同一个pod中的容器, 可以通过访问localhost互相访问, 且端口占用会冲突. 在之前的介绍中提到过, 容器的隔离是通过namespace技术实现的, 网络隔离自然…

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后&#xff0c;我常困惑于怎么过滤log&#xff0c;和以前的UI差异比较大&#xff0c;新UI界面结构如下&#xff1a; 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…

技术大佬们都是怎么学习的?

目录 问题 熟悉更多业务 熟悉端到端 自学 Do exercise Learning trying Teaching 问题 今天逛帖子的时候&#xff0c;看到这么个问题&#xff1a; 这个问题我曾经也很好奇过&#xff0c;那些成为技术大佬的人当初是怎么学习&#xff0c;以及怎么成长过来的&#xff0…

就业内推 | 上市游戏公司,六险一金,最高30K*13薪

01 吉比特 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、参与公司整体网络规划&#xff0c;制定网络运行规范 2、负责网络监控、应急相应等日常运维工作&#xff0c;及时定位及故障处理 3、负责数据中心内基础架构维护 4、负责企业I…

低代码平台:解决项目管理中的瓶颈难题

随着数字化时代的到来&#xff0c;项目管理已经成为现代企业中不可或缺的一部分。尤其是在软件开发、信息技术、新产品开发等领域&#xff0c;项目管理的重要性更加凸显。然而&#xff0c;项目管理中存在着许多痛点和瓶颈难题&#xff0c;如项目周期长、成本高、协作难度大等。…

Spring Boot进阶(38):SpringBoot之跨域配置 | 超级详细,建议收藏

1. 前言&#x1f525; 我们都知道springboot默认日志是打印在控制台中的&#xff0c;不会以文件的形式进行保存。那么日后系统上线肯定是有需要对日志进行定位分析问题的&#xff0c;那么如何实现将控制台输出的日志保存起来&#xff1f; 这将又会是干货满满的一期&#xff0c;…

最新Java适配商城系统

城前端功能展示 商城移动端 后端基于SpringBoot 研发&#xff0c;前端使用 Vue、uniapp开发 前后端分离&#xff0c;支持分布式部署&#xff0c;支持Docker&#xff0c;各个API独立&#xff0c;并且有独立的消费者 api不需要单独部署&#xff0c;只需启动一个jar包就可以正…

c语言基础知识(知识点较为完整)

计算机和c语言基础知识 计算机常识 什么是计算机? 顾名思义&#xff0c;就是能够进行数据运算的机器(台式电脑、笔记本电脑、平板电脑、智能手机) 计算机_百度百科 计算机的发明者是谁 ? 关于电子计算机的发明者是谁这一问题&#xff0c;有好几种答案: 1936年英国数学家…

Lamini:大语言模型精调框架

Lamini&#xff1a;大语言模型精调框架 精调是大型语言模型 (LLM) 开发生命周期中最困难的部分之一。如果我们谈论的是诸如人类反馈强化学习 (RLHF) 之类的技术&#xff0c;那么这个过程尤其具有挑战性&#xff0c;因为这需要特别复杂的工作流程。 最近&#xff0c;我发现诞生…

11 长效保证机制:伦理道德风险外溢临界模型

AI系统上线后&#xff0c;随着不断的投入使用AI系统会自我学习和自我演进&#xff0c;这也导致了AI系统的伦理道德性并不是一次性的验证&#xff0c;而是需要按照一定的周期不断的验证&#xff0c;通过按周期巡检的方式持续的评估AI系统的伦理道德风险的外溢可能性。如何建立一…

css、js(vue)进行textarea自适应高度(超详细说明)

文章目录 需求——如下图一、纯css 的自适应高度&#xff08;有问题&#xff0c;不推荐&#xff09;1.css代码2. html代码3. 代码截图说明4. 效果和会出现的问题 二、js 的自适应高度0.思路1.代码1. css代码2. html代码3. js代码 2.代码说明3.注意点导致的问题&#xff08;0&am…