深入算法基础二分查找数组

简介: 文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。

算法是计算机软件的基础,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去。

image.png

一、前言

数组是最基础的数据结构之一,二分查找数组是基本功,本文目的是深入学习数组以及二分查找数组算法的实战。

二、数组概念

截屏2024-01-09 23.21.15.png

关键点:

1、存储相同类型数据的序列。

2、数组在内存中是有序的。

截屏2024-01-09 23.25.29.png

三、二分查找数组实战

2分查找的基础是数组数据项是有序的,不管是增序还是降序都可以。

2分查找算法也是有技巧的,不希望以后是根据感觉写出来的或者写不出来,今天把技巧方法记录下来。

2分查找算法,首先需要确定搜索的合法左右边界,每次都取两个边界中间位置的数值和目标值进行比较

  • 如果中间值大于目标值,则将右边界改成中间值

  • 如果中间值小于目标值,则将左边界改成中间值

  • 这样不断在缩小搜索范围,最终左边界右边界会接近直到右边界小于左边界。

以下面数组查找目标值9为例

截屏2024-01-10 23.03.48.png

1、确定合法搜索边界

确定合法边界前,我们需要约定数据的范围,我们以左闭右闭[]的原则约定搜索范围,也就是说要搜索的数据包括了左右边界。

int start = 0; int end = lenght-1;

  • 怎么正确计算中位数?

可以推敲一下,使用start + (end - start) / 2 可以得到两个数的中位数

数组长度是偶数6 第一次计算中位数mid=start + (end - start) / 2 = 0+(5/2)= 3

此时索引3的数据项是5,比目标值小,那么数据位于mid 和 end之间 此时start = mid +1=4 为什么+1,因为mid位置的数不合法。

继续搜索。

第二次计算中位数=start + (end - start) / 2 = 4 +(1/2)= 4

到此找到了目标值。

class Solution {
   
   
    public int search(int[] nums, int target) {
   
   

        int start = 0;
        int end = nums.length - 1; //坚持合法数据在`左闭右闭[]`区间的原则
        while(start <= end) {
   
    //在合法数据范围内查找
            //找中位数
            int mid = start + (end - start) / 2;
            if(nums[mid] == target) {
   
   
                return mid; 
            } else if(nums[mid] > target) {
   
   
                 end = mid - 1;       //更新合法区间为 [start,mid-1],因为已知mid不合法
            } else if(nums[mid] < target) {
   
   
                 start = mid + 1;  //更新合法区间为 [mid+1,end],因为已知mid不合法
            }

        }

        return -1;

    }
}

四、总结

二分查找是一个基础算法,希望以后遇到2分查找都可以根据本文的方法写出来,不是凭感觉做出来。

记住重要的原则,需要明确合法搜索数据的区间。本文是以左闭右闭原则来解决2分查找的问题。

时间复杂度分析

时间复杂度是O(logn),这里待补充时间复杂度的计算过程。

//TODO

相关文章
|
4天前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
22 0
|
2月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
2月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
2月前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
2月前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积
|
2月前
|
算法
【算法】前缀和——寻找数组的中心下标
【算法】前缀和——寻找数组的中心下标
|
2月前
|
算法
【算法】二分查找——二分查找
【算法】二分查找——二分查找
|
2月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
32 0
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。