PHP 算法学习之二分法
来源:互联网 发布:系统同传软件 编辑:程序博客网 时间:2024/05/15 07:31
在php开发中,二分法应该算是算法里最基本的一种方法了,常用于在一个有序数组中查找某个值第一次出现的位置、最后出现的位置、或者是一段区间。
有序数组中如果用暴力的贪心算法,即遍历,时间复杂度是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)。你需要找到其中最小的元素。你可以假设数组中不存在重复的元素。
如上图旋转排序数组有以下两种情况,两种情况下最小元素都是小于数组中最后一个元素的,所以可以把数组最后一个元素的值当做参考点。
来源:公众账号
有序数组中如果用暴力的贪心算法,即遍历,时间复杂度是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)。你需要找到其中最小的元素。你可以假设数组中不存在重复的元素。
如上图旋转排序数组有以下两种情况,两种情况下最小元素都是小于数组中最后一个元素的,所以可以把数组最后一个元素的值当做参考点。
来源:公众账号
0 0
- PHP 算法学习之二分法
- 算法学习之二分法查找
- [学习笔记]排序算法之 二分法查找
- 算法学习--二分法查找
- 算法学习-二分法排序
- 编程算法之二分法
- 算法之二分法查找
- 简单算法之二分法
- 搜索算法之二分法
- 算法之:二分法
- 搜索算法之二分法
- c++算法学习笔记 之------- 冒泡法,二分法
- 算法基础编之二分法
- 基本算法之二分法查找
- 排序算法之 二分法查找
- 查找算法之二分法查找
- Java算法之二分法查找
- php经典算法(二分法、快速排序)
- el.jsp
- mongo的sum使用
- 倒计时11天,苹果iOS强制HTTPS迫在眉睫
- 自定义组合控件
- 1110. Complete Binary Tree (25)
- PHP 算法学习之二分法
- spring学习笔记 依赖注入详解
- 胆大心细去“干活”
- 简单重力感应跑步测速应用
- 微信调试之页面缓存问题
- [LeetCode]47. Permutations II && DFS及剪枝
- NVMe到底是什么?用它的SSD有啥优势?
- ES5中关于数组的一些方法(检测数组、遍历数组等)
- monkey定制脚本