用PHP实现二分法查找之递归和迭代
来源:互联网 发布:自定义号码软件 编辑:程序博客网 时间:2024/06/03 06:43
废话:
前段时间经历过的几个面试,考官都很喜欢问的一个问题是,请写一个二分法查找的算法。
我一听,嘿,简单,袖子一撸,操起键盘就扒拉扒拉。
写出来,考官一看,眉头凝成小山丘,说:你这代码网上扒的吧,我。。。从接触二分法查找后,都是这么写的,有什么问题?
不久前买了一本算法书,因为种种原因(C语言忘的太多了,读起来很费劲),只看了一丢丢就没再继续。
今天不小心知道了迭代算法。写出来的程序跑一跑的确比递归快得多。虽然不知道这个是否符合当时考官的思路,但是至少摆脱了脑海中只有递归实现二分法查找的思维定式。
关于递归和迭代分别的时间复杂度,递归的时间复杂度是O(N),而迭代的时间复杂度是O(logN),由y=N 和Y=logN两条曲线我们知道,一定是O(logN)更优一些。
以下是两段代码,和傻瓜式测效率的代码。
<?phpfunction dichotomyIterationSearch($arr, $n, $v){ $left = 0; $right = $n - 1; while ($left <= $right) { $middle = bcdiv(bcadd($right, $left), 2); if ($arr[$middle] > $v) { $right = $middle - 1; } elseif ($arr[$middle] < $v) { $left = $middle + 1; } else { return $middle; } } return -1;}$arr = [];for ($i=0;$i<300000;$i++){ $arr[] = $i;}list($first) = explode(" ",microtime());echo dichotomyIterationSearch($arr,count($arr),35387);echo '<br>';list($second) = explode(" ",microtime());echo round($second - $first,5)*1000000;function dichotomyRecursionSearch($arr, $low, $high, $v){ $middle = bcdiv(bcadd($low, $high), 2); if ($low < $high) { if ($arr[$middle] > $v) { $high = $middle - 1; return dichotomyRecursionSearch($arr, $low, $high, $v); } elseif ($arr[$middle] < $v) { $low = $middle + 1; return dichotomyRecursionSearch($arr, $low, $high, $v); } else { return $middle; } } elseif ($high == $low) { if ($arr[$middle] == $v) { return $middle; } else { return -1; } } return -1;}$arr = [];for ($i=0;$i<300000;$i++){ $arr[] = $i;}echo "<br>";list($first) = explode(" ",microtime());echo dichotomyRecursionSearch($arr,0, count($arr),35387);echo '<br>';list($second) = explode(" ",microtime());echo round($second - $first, 5)*1000000;
等等,还有一个尾递归的概念,待我研究明白,回来写博客~
如果上面代码或文字描述中又不正确的地方,请来访者能亲切的提出来,感谢~
阅读全文
0 0
- 用PHP实现二分法查找之递归和迭代
- PHP实现二分法查找(递归)
- 二分法搜索迭代和递归算法
- 二分查找的递归实现和迭代实现
- 折半查找的c++模板递归和迭代实现
- 迭代和递归分别实现二分查找
- 实现二分法查找(递归实现)
- 使用递归实现二分法查找
- 二分查找(迭代和递归)
- 二分查找(递归和普通迭代)
- 二分法查找(递归和非递归)
- 二分法查找(递归和非递归)
- Java二分法(Binary Search)查找递归算法与迭代算法
- java 用二分法(递归)实现查找指定元素
- 用python和awk实现二分法查找
- 用php递归和迭代创建级联目录
- php目录操作(递归和迭代)
- php递归和迭代的区别
- 链式语法—学习
- Crawler in python
- 148. php in_array()
- ubuntu系统用pyenv实现python多版本共存
- Android源码分析设置usb调试模式
- 用PHP实现二分法查找之递归和迭代
- Java自定义注解简单用法(使用注解的方式将javabean类转换为数据库表)
- 2017-6.18 算法竞赛分享会
- 简易版购物车
- 枚举变量enum的大小
- 二叉树中两节点之间最短路径
- Eclipse常用快捷键
- 面试题10:二进制中1的个数
- LeetCode之路:13. Roman to Integer