PHP 中的递归效率

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的版本是一样的。

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

 

posted @ 2009-11-24 13:41 暮夏 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值