二分法,不止是算法 - 你可能不知道的二分法应用

简介: 二分法大家都知道,记得应该是从初中学数学就学过,而在编程中也经常使用二分法来进行有序数列的查找。然而二分法并不紧紧局限于算法中的使用,他还被广泛使用于我们的工具中、数学中甚至生活中。

网络异常,图片无法展示
|

二分法大家都知道,记得应该是从初中学数学就学过,而在编程中也经常使用二分法来进行有序数列的查找。

然而二分法并不紧紧局限于算法中的使用,他还被广泛使用于我们的工具中、数学中甚至生活中。

算法应用

算法中会使用二分法进行查找,然后使用两个索引来代表目标数据所可能在的范围,然后将数组从中间进行拆分,拿到中间数进行比对,即可根据数组的排序顺序、目标元素和中间数的大小比较,得出更小的比对区间,从而一次次缩小查找范围,在面对大数据时,可以有效的减少查找时间,提升查找效率,将事件复杂度缩小到 O(log2(n))。不过二分法也存在一定局限性,必须要数组是有序的。

可以大概看一下实现,一段平平无奇的二分查找代码:

export const binarySearch = (arr: number[], target: number): number => {
    const len = arr.length;
    if (!len) return -1;
    let startIndex = 0;
    let endIndex = len - 1;
    while (startIndex <= endIndex) {
        let midIndex = ((startIndex + endIndex) / 2) | 0;
        let midTarget = arr[midIndex];
        if (target === midTarget) return;
        target < midTarget ? (endIndex = midIndex - 1) : (startIndex = midIndex + 1);
    }
    return -1;
};
复制代码

当然,上面只是顺带提过,并非本文的重点,下面说下二分法在非算法领域的应用,看看它的应用之广泛,可能超乎你的想象。

Git 中的二分法

git 中就存在二分法的另一种应用:git bisect。当我们代码上线后突然有一天一个最近根本没改动的模块出现问题了,一般会很难定位问题是由哪次改动引起的。这是便可以使用 git bisect 进行帮助定位。要启动我们一般会指定一个起点 hash,终点一般就是当前 HEAD。

git bisect start HEAD HEAD~10
复制代码

git 会切换到 HEAD~10 的 commit 上,此时你可以查看当前版本是否存在该 bug,然后根据存在结果判定输入 git bisect goodgit bisect bad。git 便会自动在 bad 范围中进行二分,缩小查找范围,直到最终确定最先出现 bug 的 commit:a819d21 is the first bad commit

借助 git bisect 可以在 bug 不明确时快速定位到初次导致 bug 的 commit,便可借助当次 commit 中的修改,快速定位到引起 bug 的原因。

VSCode 中的二分法

而在 VSCode 中,二分法也同样有着类似的用途。VSCode 作为一代轻量级 IDE 新秀,虽然功能已经非常丰富,但是对比一些专业的 IDE 在很多功能上还是有所欠缺。所以开发者都会使用大量插件来弥补这些功能。然而插件五花八门,质量参差不齐,很容易就会出现一些插件导致内存泄漏、CPU 爆满的情况。所以在这种情况下就需要一个个禁用插件来排查到底是什么插件导致的问题。于是乎 VSCode 中也出现了自带的二分法定位问题插件的功能。

要启动该功能,只需要启动 VSCode 命令输入 Extension Bisect,也可在插件菜单中启动。

网络异常,图片无法展示
|

启动后 VSCode 提示本次可能需要的次数等说明,确定后便会将插件进行拆分禁用,然后在右下角询问当前情况是否正常(可能需要手动点击右下角消息提示打开)。

网络异常,图片无法展示
|

从而一次次缩小范围,定位到引起问题的插件。

网络异常,图片无法展示
|

除了定位插件的 bug,你也可以借助它来定位插件的功能,比如你很好奇某个 snippet 是哪个插件提供的,同样可以借助它来定位。

BUG 定位中的二分法

除了上述工具自带的这些应用了二分法的工具,我们在实际编程过程中同样可以借助二分法来定位 bug。

通常修 bug 时最难的不是改代码,而是定位代码。首先必须要知道导致 bug 的代码位置才能修复它。所以日常遇到 bug 却毫无头绪时,二分法可以非常无脑的帮你缩小需要排查的范围。

除了上面的 git bisect,我通常还会通过代码分割来进行代码定位,比如一个页面上有多个模块,此时便可将模块进行去除,然后查看 bug 是否消除来不断判定缩小查找范围,从而最终定位。又比如页面中的样式出现无法理解的情况,也可以通过将生效的样式、嵌套位置等进行二分来进行原因定位。

生活中的二分法

除了上述在编程中的二分法使用,我们在生活中也可以使用二分法来解决问题。

比如发布文字到网上遇到 SC,死活通不过而自己又找不到失败的原因,就可以使用二分法分段尝试定位。比如数据上传过大,又不知道上传多大的数据包合适,可以通过二分法尝试出合适的大小。比如和小朋友玩游戏,抽一张扑克牌、或写一个数字,然后看看谁能更快的猜到数字是多少。比如一些有意思的数学题,100 个看起来一样的球里有一个重量比其它的重,有一个天平如何快速的找出不同的那颗球。

总结

二分法是一种很常见的方法,他的本质是通过判定查找目标是否在某个范围内,然后不断对范围进行拆分定位,从而进行批量的筛除,达成查找的目的。只要在能够判定目标范围的情况下,二分法都能发挥出不错的效果。除了二分法,还可以使用三分法等其它衍生的方案,其本质是想通的。如果大家还知道哪些关于二分法的使用案例,欢迎留言。

在生活中同样可以使用二分法,不过在专业领域个人觉得还是要以思考为优先,能够直接动脑的就不要"动手",毕竟二分法就是一种试错法(比依次试错好一丢丢的那种),产生依赖很容易丢失自己的思考能力。🤦‍♂️ 在一些非专业领域,或者丧失思考能力的情况下还是很推荐的。🐶

相关文章
|
10月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
344 0
|
9月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
501 3
|
9月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
9月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
9月前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。
788 0
|
分布式计算 并行计算 算法
MapReduce在实现PageRank算法中的应用
总结来说,在实现PageRank算法时使用MapReduce能够有效地进行大规模并行计算,并且具有良好的容错性和可扩展性。
536 76
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
2014 3
|
11月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
11月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
727 1
|
10月前
|
算法 数据可视化
matlab版本粒子群算法(PSO)在路径规划中的应用
matlab版本粒子群算法(PSO)在路径规划中的应用

热门文章

最新文章