算法怎么算:二分为什么是闪电?

简介: 代码实现这里我使用了两种方式,感兴趣的同学可以用更多的方式自己尝试。

引言

在基础查询算法中有一个是不能避开的点:二分查找。


接触算法的同学翻开书的前几节,大概率是桶排序、冒泡、快排、然后就是经典的二分查找。


一开始接触的话不容易从理论中联系到生产实际上,查找,这个最基本的事情,怎么和项目级,产品级、工业级的实际使用构建联系起来呢?

这个问题是我们在展开二分法查找前要说明的问题,我们首先要达成的共识是要对它产生足够的兴趣。


什么是查找

查找,是将储备在需要时提取并使用的一个过程。任何事情,只要你想要通过某种行为达到目的,那么这种行为就一定包含查找的过程。


所以二分查找就可以认为是为了更快达到目的使用的一种手段。接下来让我们说说什么是二分。


什么是二分

所谓二分,就是指将线性的处理路线,变化为跳跃的。也因此他多了一些前置条件,来保证跳跃的过程不会忽视路过的风景。 —— 有序。


因为有序,我们就可以进行逻辑推理,不会受到混沌随机的因素干扰,所以让我们开始二分查找的探讨吧。。


思想核心是什么

首先让我们站在起点,这是一切的开始。

接着我们向前跳跃,落地之后看看脚下的内容和我的目标有多大的差距。


如果距离我们的目标要大,说明目标在我们后方(跳过了),接下来我们往回跳。

如果距离我们的目标要小,说明目标在我们前方(还没到),接下来我们再前跳。

我们并不关心在跳跃的过程中飞过了哪些东西,我们只要知道目标在哪,我们离它有多远。

这就是二分查找的思想,接下来解释:为什么他是闪电


为什么他会这么快

如果从逻辑上解答,在有序中我们可以通过推理跳过最为漫长的认知部分。

如果从行为上解答,他找的数要少的多。(这是有序给他的基础支撑)。


举个例子

如果我想要从十亿个数中找到目标,单次查找要一毫秒,那我线性查找可是要以年做单位的,(有兴趣的朋友可以算算具体的数据)。如果我使用二分查找的话,我实际的次数是30次。不到一秒钟。


这个例子有意义吗?其实,这是美国NASA在航天器登录前的两秒内要解决的事情。那十亿个数是他的登陆参数。


到此,我们知道了二分法查找的意义和思想。接下来,我们要回到实际中了。


代码实现

这里我使用了两种方式,感兴趣的同学可以用更多的方式自己尝试。


C++
/*
 * @Author       : Zry && 978524088@qq.com
 * @Date         : 2023-05-31 09:15:18
 * @LastEditors  : Zry && 978524088@qq.com
 * @LastEditTime : 2023-05-31 09:36:44
 * @FilePath     : /zryTest/test/C++/二分法查找/binarySearch.cxx
 * @Description  :
 *
 * Copyright (c) 2023 by 978524088@qq.com, All Rights Reserved.
 */
#include <iostream>
#include <assert.h>
using namespace std;
#define int_t int
#define ZRY_OK 0
#define ZRY_NO_FIND -1
int_t binarySearch(int *List, const int iLen, const int item)
{
    int ilow = 0;
    int ihght = iLen - 1;
    int imin = 0;
    for (int i = 0; ilow <= ihght; i++)
    {
        imin = (ilow + ihght) / 2;
        int iguess = List[imin];
        if (iguess == item)
        {
            return imin;
        }
        if (iguess > item)
        {
            ihght = imin - 1;
        }
        else
        {
            ilow = imin + 1;
        }
        printf("第 %d 查找 low=%d hight=%d\n", i, ilow, ihght);
    }
    return ZRY_NO_FIND;
}
void test_binarySearch()
{
    int list[] = {1, 2, 3, 4, 5, 65, 66, 67, 68, 69, 77, 78, 79, 80, 100};
    printf("开始测试1\n");
    assert(ZRY_NO_FIND != binarySearch(list, sizeof(list) / sizeof(int), 77));
    printf("开始测试2\n");
    assert(ZRY_NO_FIND == binarySearch(list, sizeof(list) / sizeof(int), 55));
    printf("测试结束\n");
}
int main()
{
    test_binarySearch();
    return ZRY_OK;
}


Python

def binarySearch(List, item):
    iLen = len(List)
    ilow = 0
    ihght = iLen - 1
    imin = 0
    i = 0
    while ilow <= ihght:
        imin = (ilow + ihght) // 2
        iguess = List[imin]
        if iguess == item:
            return imin
        if iguess > item:
            ihght = imin - 1
        else:
            ilow = imin + 1
        print("第 %d 查找 low=%d hight=%d" % (i, ilow, ihght))
        i += 1
    return -1
def test_binarySearch():
    list = [1, 2, 3, 4, 5, 65, 66, 67, 68, 69, 77, 78, 79, 80, 100]
    print("开始测试1")
    assert(binarySearch(list, 77) != -1)
    print("开始测试2")
    assert(binarySearch(list, 55) == -1)
    print("测试结束")
if __name__ == '__main__':
    test_binarySearch()


总结

我们可以进一步的扩大二分的场景,从参数查找、到并发请求响应,从信息索引到数据支撑。


脱去外壳,只要我们可以在有序中找寻我们的目标,就可以二分。

目录
相关文章
|
机器学习/深度学习 传感器 编解码
路径规划算法:基于闪电搜索优化的机器人路径规划算法- 附matlab代码
路径规划算法:基于闪电搜索优化的机器人路径规划算法- 附matlab代码
|
机器学习/深度学习 传感器 编解码
路径规划算法:基于闪电连接过程优化的机器人路径规划算法- 附matlab代码
路径规划算法:基于闪电连接过程优化的机器人路径规划算法- 附matlab代码
|
23天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
23天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
1月前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
24天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
25天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
|
25天前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
7天前
|
算法
基于ACO蚁群优化的UAV最优巡检路线规划算法matlab仿真
该程序基于蚁群优化算法(ACO)为无人机(UAV)规划最优巡检路线,将无人机视作“蚂蚁”,巡检点作为“食物源”,目标是最小化总距离、能耗或时间。使用MATLAB 2022a版本实现,通过迭代更新信息素浓度来优化路径。算法包括初始化信息素矩阵、蚂蚁移动与信息素更新,并在满足终止条件前不断迭代,最终输出最短路径及其长度。