PHP 算法学习之二分法

1,749 阅读2分钟
原文链接: mp.weixin.qq.com

最近重新开始学习算法,因为觉得这个一个本质的思想性的东西,无论何时,都可以从此收益,于是打算记录一下自己学习算法的一些体会。二分法应该算是算法里最基本的一种方法了,常用于在一个有序数组中查找某个值第一次出现的位置、最后出现的位置、或者是一段区间。有序数组中如果用暴力的贪心算法,即遍历,时间复杂度是O(n)。

用二分法后,由于每次可以去掉一半无用的区间,会将时间复杂度减少到O(logn)。

二分法的基本做法是:1、确定要查找的区间。2、确定要二分时的参照点。2、区间内选取二分点。3、根据二分点的值,综合左右区间情况以及求解的目的,舍去一半无用的区间。

4、在有用的区间继续进行二分搜索。

下面是几道比较经典的题目:1、给定一个升序数组以及一个目标整数target,返回target首次出现的下标位置,如果不存在返回-1。此题目已给定升序数组,所以待求区间确定,第一步就可省略了。


2、同样是上面的题目,条件变换一下,即给定的数组可以想想为无穷大,但是你可以通过get_value($key)来获取某个下标下的值,求target第一次出现的位置。此时相当于给定的区间不确定了,所以你先要锁定一个求解区间,增加代码如下:


3、假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7可能变成是4 5 6 7 0 1 2)。你需要找到其中最小的元素。你可以假设数组中不存在重复的元素。


如上图旋转排序数组有以下两种情况,两种情况下最小元素都是小于数组中最后一个元素的,所以可以把数组最后一个元素的值当做参考点。


--------------伟大的分割线----------------

PHP饭米粒(phpfamily) 由一群靠谱的人建立,愿为PHPer带来一些值得细细品味的精神食粮!

饭米粒只发原创或授权发表的文章,不转载网上的文章

所发的文章,均可找到原作者进行沟通。

也希望各位多多打赏(算作稿费给文章作者),更希望大家多多投搞。

投稿请联系:

shenzhe163@gmail.com

本文由 ShutLove 向 饭米粒投稿,转载请注明本来源信息和以下的二维码(长按可识别二维码关注)