【算法】二分查找——二分查找

简介: 【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论,有需要借鉴即可。



1.二分查找

1.1使用前提

使用的条件:数组具有“二段性,二段性指的是数组可以根据某一规律分为两组,且在干掉一半之后仍可以对另一半进行复用相同的规律。

1.2模板

二分查找的代码具有高度统一性,因而可以套用模板,但这并不意味着自己不需要用脑子无脑套模板。

一般二分查找模板、查找左边界二分模板、查找右边界二分模板。

下面是通过一道具体的题目来介绍二分查找算法的由来。

2.题目

题目链接:LINK

首先肯定是暴力解法,挨个遍历就行了,找到了返回对应的下标,找不到返回-1

但是这个暴力解法有点慢,慢就慢在一次只能干掉一个数字。

有序数组满足“二段性”,这里的“二段性”就是以某个数字作比较,可以将数组分为比这个数字大的一组和小的一组,因而可以利用有序的特点直接上二分查找算法。

思考:结束条件是什么?

答:left <= right,这个等于一定要注意,因为一个数字也要判断一下。

不然会出下以下“悲剧”:

思考:为什么一定得二分,而不是三分、四分…N分?

答:这里推一篇文章,有兴趣可以看一下:LINK

二分查找复杂度

答:logN

3.题解代码示例

class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        //一般情况
        for(int left = 0,right = nums.size() - 1,mid; left <= right;)
        {
            //mid = (left + right) / 2;
            mid = left + (right - left) / 2;//优化,防止两数相加溢出问题
            if(nums[mid] > target)right = mid - 1;
            else if(nums[mid] < target)left = left + 1;
            else return mid;
        }
        return -1;
    }
};

4.二分查找的一般模板

while(left < right)
{
int mid = left + (right - left) / 2;
if(...)
//
else if(...)
//
else
return ...
}

5.总结

我感觉二分查找大部分人是比较熟悉的,这里需要注意两个点,为什么是二分?二分查找的使用前提一定是有序吗?

题目太简单,不多说。


EOF

相关文章
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
1月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
1月前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
18 0
|
3月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
4月前
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
42 0
【算法】二分查找(整数二分和浮点数二分)
|
5月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
5月前
|
机器学习/深度学习 算法 索引
数据结构算法--1 顺序查找二分查找
**顺序查找时间复杂度为O(n)**,适合无序列表,可以通过`enumerate`或直接遍历索引来实现。**二分查找时间复杂度为O(logn)**,适用于有序列表,利用Python中`left`、`right`指针和`mid`点不断缩小搜索范围。效率上二分查找更优。
|
5月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
58 1