用PHP实现二分法查找之递归和迭代
2018-03-27 15:25
423 查看
关于递归和迭代分别的时间复杂度,递归的时间复杂度是O(N),而迭代的时间复杂度是O(logN),由y=N 和Y=logN两条曲线我们知道,一定是O(logN)更优一些。以下是两段代码,和傻瓜式测效率的代码。<?php
function 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;
function 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;
相关文章推荐
- 用PHP实现二分法查找之递归和迭代
- PHP中实现二分法查找的两种方法
- 递归 / 迭代两种方法实现查找指定目录下所有文件
- 二分查找的递归实现和迭代实现
- PHP迭代与递归实现无限级分类
- 求n的阶乘(递归&&非递归),Fibonacci函数,二分法查找,汉诺塔实现,排列组合,整数划分,一元多项式的加减乘
- 递归实现二分法查找----python
- php递归与迭代实现斐波那契数列
- PHP中实现二分法查找的两种方法
- 迭代用在有序数组二分法查找中,递归的二分法查找更简洁,但速度可能会慢一点
- PHP中实现二分法查找的两种方法
- 使用PHP引用实现无限分类思路(非递归迭代)
- 迭代和递归分别实现二分查找
- PHP迭代与递归实现无限级分类
- 【查找】二分查找:C++递归实现与迭代实现
- 二分法查找的实现 递归与非递归方法
- 快速排序、二分法查找的PHP实现代码
- C++实现二叉树所有操作 -- 创建递归遍历迭代遍历拷贝清空查找
- PHP基于二分法实现数组查找功能示例【循环与递归算法】
- php使用递归与迭代实现快速排序示例