在下面的算法中,我无法理解为什么复杂度为O(N + M),由codility.com检验工具计算,而不是O(NM)。我认为它是O(NM),因为两个迭代一个嵌套到另一个。
function solution($N, $A) {
// write your code in PHP7.0
$counter=[];
$max=0;
foreach($A as $value){
if($value >= 1 && $value <= $N){
isset($counter[$value-1]) ? $counter[$value-1]++ : $counter[$value-1] = 1;
if($counter[$value-1] > $max){
$max = $counter[$value-1];
}
}
if($value == $N+1){
for($i = 0; $i<$N; $i++){
$counter[$i]=$max;
}
}
}
return $counter;
}
由于我还没有真正理解这两种复杂性之间的差异,有人能给我两个简单的算法来展示这两种复杂性吗?
答案 0 :(得分:0)
如果A
数组中的所有值都等于N+1
,那么counter
数组将被填充M=Length(A)
次,因此最坏的情况是O(N*M)
,如果A
内容没有特殊限制。