一尘不染

PHP数组-删除重复项(时间复杂度)

algorithm

好的,这不是“如何获取所有唯一性”或“如何从php中的数组中删除重复项”的问题。这是关于时间复杂度的问题。

我认为array_unique有点O(n ^ 2–n),这是我的实现:

function array_unique2($array) 
{ 
    $to_return = array(); 
    $current_index = 0;

    for ( $i = 0 ; $i < count($array); $i++ ) 
    { 
        $current_is_unique = true;

        for ( $a = $i+1; $a < count($array); $a++ ) 
        { 
            if ( $array[$i] == $array[$a] ) 
            { 
                $current_is_unique = false; 
                break; 
            } 
        } 
        if ( $current_is_unique ) 
        { 
            $to_return[$current_index] = $array[$i];
        }

    }

    return $to_return; 
}

但是,当针对基准进行测试时,array_unique我得到以下结果:

测试(array_unique2)…操作耗时0.52146291732788 s。

测试(array_unique)…操作耗时0.28323101997375秒。

这使array_unique快一倍,我的问题是,为什么(两者都有相同的随机数据)?

我的一个朋友写道:

function array_unique2($a)
{
    $n = array();
    foreach ($a as $k=>$v)
        if (!in_array($v,$n))
            $n[$k]=$v;
    return $n;
}

这是内置在php中的两倍。

我想知道,为什么?

array_unique和in_array的时间复杂度是多少?

编辑 我从两个循环中删除了count($ array),只是在函数顶部使用了一个变量,在100000个元素上获得了2秒!


阅读 236

收藏
2020-07-28

共1个答案

一尘不染

虽然我不能说原生的array_unique函数,但我可以告诉您,您的朋友算法更快,因为:

  1. 他使用单个foreach循环,而不是双for()循环。
  2. 与PHP中的for循环相比,foreach循环的执行速度往往更快。
  3. 他使用了一个if(!)比较,而您使用了两个if()结构
  4. 您的朋友唯一调用的附加函数是in_array,而您两次调用count()。
  5. 您做了三个不需要您的朋友声明的变量($ a,$ current_is_unique,$ current_index)

尽管这些因素都不是一个巨大的因素,但我可以看到累积影响将使您的算法花费比您的朋友更长的时间。

2020-07-28