zoukankan      html  css  js  c++  java
  • 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的版本是一样的。

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

  • 相关阅读:
    May LeetCoding Challenge3 之 HashMap的使用
    May LeetCoding Challenge2 之 HashSet的使用
    May LeetCoding Challenge1 之 标准二分查找法
    30-Day Leetcoding Challenge Day21
    30-Day Leetcoding Challenge Day19
    30-Day Leetcoding Challenge Day18
    ALV 单元格编辑回车响应
    ALV模版1
    web dynpro 开发配置
    convert fm
  • 原文地址:https://www.cnblogs.com/niniwzw/p/1609432.html
Copyright © 2011-2022 走看看