用PHP实现二分法查找之递归和迭代

关于递归和迭代分别的时间复杂度,递归的时间复杂度是O(N),而迭代的时间复杂度是O(logN),由y=N 和Y=logN两条曲线我们知道,一定是O(logN)更优一些。

以下是两段代码,和傻瓜式测效率的代码。

  1. <?php  
  2.   
  3. function dichotomyIterationSearch($arr$n$v)  
  4. {  
  5.     $left   = 0;  
  6.     $right  = $n - 1;  
  7.     while ($left <= $right) {  
  8.         $middle  = bcdiv(bcadd($right$left), 2);  
  9.         if ($arr[$middle] > $v) {  
  10.             $right = $middle - 1;  
  11.         } elseif ($arr[$middle] < $v) {  
  12.             $left  = $middle + 1;  
  13.         } else {  
  14.             return $middle;  
  15.         }  
  16.     }  
  17.     return -1;  
  18. }  
  19.   
  20.   
  21. $arr = [];  
  22. for ($i=0;$i<300000;$i++){  
  23.     $arr[] = $i;  
  24. }  
  25. list($first) = explode(" ",microtime());  
  26. echo dichotomyIterationSearch($arr,count($arr),35387);echo '<br>';  
  27. list($second) = explode(" ",microtime());  
  28. echo round($second - $first,5)*1000000;  
  29.   
  30.   
  31. function dichotomyRecursionSearch($arr$low$high$v)  
  32. {  
  33.     $middle = bcdiv(bcadd($low$high), 2);  
  34.   
  35.     if ($low < $high) {  
  36.         if ($arr[$middle] > $v) {  
  37.             $high = $middle - 1;  
  38.             return dichotomyRecursionSearch($arr$low$high$v);  
  39.         } elseif ($arr[$middle] < $v) {  
  40.             $low = $middle + 1;  
  41.             return dichotomyRecursionSearch($arr$low$high$v);  
  42.         } else {  
  43.             return $middle;  
  44.         }  
  45.     } elseif ($high == $low) {  
  46.         if ($arr[$middle] == $v) {  
  47.             return $middle;  
  48.         } else {  
  49.             return -1;  
  50.         }  
  51.     }  
  52.     return -1;  
  53. }  
  54.   
  55.   
  56. $arr = [];  
  57. for ($i=0;$i<300000;$i++){  
  58.     $arr[] = $i;  
  59. }  
  60. echo "<br>";  
  61. list($first) = explode(" ",microtime());  
  62. echo dichotomyRecursionSearch($arr,0, count($arr),35387);echo '<br>';  
  63. list($second) = explode(" ",microtime());  
  64. echo round($second - $first, 5)*1000000;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值