(算法)三道事例让你懂得二分法

本文概述了二分法与常规遍历排序方法的区别,重点介绍了二分法在有序数组搜索中的时间复杂度优势,以及在查找特定数值、定位范围和无序数组局部最小值等问题上的应用。通过实例解析,展示了二分法如何将查找时间降至O(logN)。

简述二分法与常规找排序的不同以及优势

通常我们在寻找一个有序数组中的最大值,或者是找某个数,最常规的做法是遍历,比如从左向右依次比较,时间复杂度为O(N),而使用二分法,则可以将时间复杂度控制到O(logN,log(2,N在这里通常简写为logN))。

第一个简单事例来初步了解

  • 在一个有序数组中,寻找到一个指定的数。

(1)常规做法,遍历一边O(N)

(2)使用二分法:我们找到整个数组的中间位置,将它与需要寻找的指定数字进行比较,若中间数字比目标数字小,则我们可以确定该数字在整个数组的右边,再对右半边数组进行二分,找到中间的数字比较,继续二分,直到找到该数字。

因为每次都是对剩下部分的 二分之一进行一个比较的处理,所以得到时间复杂度为O(logN)

第二个事例

  • 在一个有序数组里面,找到大于等于(<=)某个数的最左侧的位置。

 

 比如上面这个有序数组,我们目标找到小于等于2的最左侧的那个数字,首先进行二分,找到中间的2,等于目标数字(但是不确定它是不是最左侧的),我们选择左半边的数组再进行二分,得到1,小于目标数字,说明目标数字在它的右边,我们以它为左边边界,前一个2作为右边边界,继续进行二分,等于2,然后发现它的左边只有1个1,得出我们要找的目标数字。(ps:它与前一个事例的一个重要区别,它必须二分到底,才得到我们的结果)

第三个事例

(二分法并非只有在有序数组里面使用,无序数组中同样适用)

  • 在一个无序数组中,需要找到一个局部最小的数。(局部最小,就是一个数字比它两边都小,比如[312],该数组中“1”就是局部最小,同样两头的数[132],该数组中“1”和“2”都是局部最小)

我们在遇到题目时,首先一定要先看它的特性,无论是否是有序。

首先查看两头的数字是不是局部最小,如果是,则可以直接返回,若不是,我们进行二分,找到中间数字查看是否是局部最小,若不是则它大于两边的数字,那么,无论是左边还是右边都一定存在一个局部最小,看下图参考理解。

 它们在旁边一定有一个向下降的势,两头都是下降那么中间一定有一个局部最小。

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记阿楠同学黑历史的小册子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值