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

news/2025/2/9 6:07:12 标签: 算法, 编程语言, 计算机技术, Java, 二分法

文章目录

二分法

说明


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

二分法的时间复杂度为 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.niftyadmin.cn/n/352832.html

相关文章

【满分】【华为OD机试真题2023B卷 JAVA】数据最节约的备份方法

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 数据最节约的备份方法 知识点动态规划 时间限制:2s 空间限制:256MB 限定语言:不限 题目描述: 有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求使用光盘最少的文件分布方式 所有文件的大小都是…

MySQL之索引初步

1. 索引概念 数据库是⽤来存储数据&#xff0c;在互联⽹应⽤中数据库中存储的数据可能会很多(⼤数据)&#xff0c; 数据表中数据的查询速度会随着数据量的增⻓而逐渐变慢 &#xff0c;从⽽导致响应⽤户请求的速度变慢——⽤户体验差&#xff0c;我们如何提⾼数据库的查询效率呢…

数据结构学习之路-集合

集合Set 集合的特点集合的内部实现&#xff08;使用链表&#xff09;集合的内部实现&#xff08;使用红黑树&#xff09;复杂度分析使用红黑树实现集合的限制 集合的特点 不存放重复的元素常用于去重 例如&#xff1a;存放新增的IP地址&#xff0c;统计新增IP量&#xff1b;存…

javascript数组条件过滤,reduce函数

javaScript中的reduce()方法是一个非常实用的数组实例方法。它主要用于将数组中的所有元素通过一个累加器函数&#xff0c;最终计算为一个单一的值。 reduce()方法接受两个参数&#xff1a;第一个参数是一个回调函数&#xff08;也称为累加器函数&#xff09;&#xff0c;第二…

[C++/PTA] 立方体类的实现

[C/PTA] 立方体类的实现 题目要求解题思路代码总结 题目要求 立方体类Box的实现&#xff0c;完成计算体积、计算表面积、输出结果等功能。其中给定的主函数为&#xff1a; int main( ){float ab;cin>>ab;Box obj;obj.seta( ab );obj.getvolume( );obj.getarea( );obj…

电脑回收站清空了怎么恢复回来

在日常使用电脑的过程中&#xff0c;我们可能会遇到误删文件&#xff0c;或者在清空电脑回收站时却发现有些文件还需要使用的情况。此时&#xff0c;许多小伙伴都会问&#xff1a;电脑回收站清空了怎么恢复回来?本文将为大家详细介绍如何从回收站中恢复被删除的文件。 Windows…

总结springboot项目中一些后端接收前端传参的方法

文章目录 1、java方法入参里面什么注解都没有2、不使用&#xff1f;&来拼接参数&#xff0c;在参数中添加PathVariable注解3、RequestBody 先创建一个springboot项目&#xff0c;并在pom文件中添加web依赖&#xff1a; <dependency><groupId>org.springframewo…

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

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