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

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

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

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

你可能感兴趣的:(用PHP实现二分法查找之递归和迭代)