PHP 中的递归效率

PHP的递归效率一般认为是低效的。大概一年前,我写了一篇博文,对三种遍历树的方法进行了比较,发现递归算法的效率最低。

http://www.cnblogs.com/niniwzw/archive/2008/06/28/1231410.html

而且是差了3倍的效率。所以,PHP中的递归一定要小心的对待。

最近写了一个快速排序的算法,发现PHP中的递归效率不能一刀切,在各种不同的服务器中,可能会表现不一样。

function qsort(&$arr)
{
    _quick_sort(
$arr, 0, count($arr- 1);
}

/**
 * 采用递归算法的快速排序。
 *
 * @param array $arr 要排序的数组
 * @param int $low  最低的排序子段
 * @param int $high 最高的排序字段
 
*/
function _quick_sort(&$arr, $low, $high)
{
     
$low_data = $arr[$low];
     
$prev_low = $low;
     
$prev_high = $high;
     
while ($low < $high
     {
            
while ($arr[$high>= $low_data && $low < $high) {
                
$high--;
            }
            
if ($low < $high) {
                
$arr[$low= $arr[$high];
                
$low++;
            }
            
while ($arr[$low<= $low_data && $low < $high) {
                
$low++;
            }
            
if ($low < $high) {
                
$arr[$high= $arr[$low];
                
$high--;
            }
     }
     
$arr[$low= $low_data;
     
if ($prev_low < $low) {
         _quick_sort(
$arr, $prev_low, $low);
     }
     
if ($low + 1 < $prev_high) {
         _quick_sort(
$arr, $low + 1, $prev_high);
     }
}

function quick_sort(&$arr)
{
    
$stack = array();
    
array_push($stack, 0);
    
array_push($stack, count($arr-1);
    
while (!empty($stack)) {
        
$high = array_pop($stack);
        
$low = array_pop($stack);
        
$low_data = $arr[$low];
        
$prev_low = $low;
        
$prev_high = $high;
        
while ($low < $high
        {
            
while ($arr[$high>= $low_data && $low < $high) {
                
$high--;
            }
            
if ($low < $high) {
                
$arr[$low= $arr[$high];
                
$low++;
            }
            
while ($arr[$low<= $low_data && $low < $high) {
                
$low++;
            }
            
if ($low < $high) {
                
$arr[$high= $arr[$low];
                
$high--;
            }
        }
        
$arr[$low= $low_data;
        
if ($prev_low < $low) {
            
array_push($stack, $prev_low);
            
array_push($stack, $low);
        }
        
if ($low + 1 < $prev_high) {
            
array_push($stack, $low + 1);
            
array_push($stack, $prev_high);
        }
    }
}

下面是测试速度的代码:

function qsort_test1()
{
    $arr = range(1, 1000);
    shuffle($arr);

    $arr2 = $arr;
    $t1 = microtime(true);
    quick_sort($arr2);
    $t2 = microtime(true) - $t1;
    echo "非递归调用的花费:" . $t2 . "\n";

    $arr1 = $arr;
    $t1 = microtime(true);
    qsort($arr1);
    $t2 = microtime(true) - $t1;
    echo "递归调用的花费:" . $t2 . "\n";

在我的IIS 服务器上(CGI)模式,我的测试结果是:

非递归调用的花费:0.036401009559631
递归调用的花费:0.053439617156982

在我的Apache 服务器上,我的测试结果是:

非递归调用的花费:0.022789001464844
递归调用的花费:0.014809131622314


结果完全相反,而PHP的版本是一样的。

看来对递归的效率要具体问题具体分析了。

原文地址:https://www.cnblogs.com/niniwzw/p/1609432.html