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

news/2025/3/15 4:37:21/

引言

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

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

一开始接触的话不容易从理论中联系到生产实际上,查找,这个最基本的事情,怎么和项目级,产品级、工业级的实际使用构建联系起来呢?
这个问题是我们在展开二分法查找前要说明的问题,我们首先要达成的共识是要对它产生足够的兴趣。

什么是查找

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

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

什么是二分

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

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

思想核心是什么

首先让我们站在起点,这是一切的开始。
接着我们向前跳跃,落地之后看看脚下的内容和我的目标有多大的差距。

  • 如果距离我们的目标要大,说明目标在我们后方(跳过了),接下来我们往回跳。
  • 如果距离我们的目标要小,说明目标在我们前方(还没到),接下来我们再前跳。
  • 我们并不关心在跳跃的过程中飞过了哪些东西,我们只要知道目标在哪,我们离它有多远。

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

为什么他会这么快

如果从逻辑上解答,在有序中我们可以通过推理跳过最为漫长的认知部分。
如果从行为上解答,他找的数要少的多。(这是有序给他的基础支撑)。

举个例子

如果我想要从十亿个数中找到目标,单次查找要一毫秒,那我线性查找可是要以年做单位的,(有兴趣的朋友可以算算具体的数据)。如果我使用二分查找的话,我实际的次数是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 -1int_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 = 0ihght = iLen - 1imin = 0i = 0while ilow <= ihght:imin = (ilow + ihght) // 2iguess = List[imin]if iguess == item:return iminif iguess > item:ihght = imin - 1else:ilow = imin + 1print("第 %d 查找 low=%d hight=%d" % (i, ilow, ihght))i += 1return -1def 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()

总结

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

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


http://www.ppmy.cn/news/115803.html

相关文章

4.1 Spark SQL概述、数据帧与数据集

一、数据帧 - DataFrame &#xff08;一&#xff09;准备工作 1、准备数据文件 2、启动Spark Shell &#xff08;二&#xff09;加载数据为Dataset 1、读文件得数据集 2、显示数据集内容 3、显示数据集模式 &#xff08;三&#xff09;给数据集添加元数据信息 1、定…

拯救者Y7000P 2020H款安装deepin20.5后资源空闲时经常出现风扇狂转现象

拯救者Y7000P 2020H款安装deepin20.5后资源空闲时经常出现风扇狂转现象 记录下来备忘&#xff0c;不要再踩坑了&#xff01;

【华为OD机试真题2023B卷 JAVAJS】数大雁

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 数大雁 知识点字符串 时间限制:1s 空间限制:32MB 限定语言:不限 题目描述: 一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。具体的: 1. 大雁发出的完整叫声为"quac…

oracle中建立job定期运行存储过程 参数

Plsql developer dbms schedual job里面编辑也可以 手动方式&#xff1a; 1 首先查看 SQL> show parameter job NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ job_queue_pro…

2022年苹果二手报价最新

二手手机市场情况随时都在变化&#xff0c;很多人不知道二手价格&#xff0c;这边统计了下二手苹果手机的价格给大家参考&#xff08;数据来源&#xff1a;换换二手交易平台&#xff09;

iphone二手价格表

苹果手机用户众多苹果的二手手机价格也是很多人关注的事情下面统计了下苹果二手手机价格表发给大家参考下&#xff08;数据来源&#xff1a;换换二手交易平台&#xff08;换换回收app&#xff09;&#xff09;

小米手机二手最新价格2022.2.23

很多网友心里都有一个疑问那就是自己的手机还能值多少钱&#xff0c;但是不知道什么渠道去查询价格。 今天我就为大家带来2022年2月23日最新的小米手机回收价格表。数据来源&#xff1a;换换回收。

二手华为手机价格表

华为手机用户众多&#xff0c;华为二手手机价格也是很多人关注的事情下面统计了下华为二手手机价格表发给大家参考下&#xff08;数据来源&#xff1a;换换二手交易平台&#xff08;换换回收app&#xff09;&#xff09;