假设我有这个程序,我想比较2个输入列表.假设数组A和数组B.如何确定函数的最佳情况和最坏情况?
这是我在[php]中的代码:
foreach($array_1 as $k){
if(!in_array($k, $array_2)){
array_push($array_2, $k);
}
}
Run Code Online (Sandbox Code Playgroud)
for循环的最佳情况和最坏情况是什么?请包括一些解释,谢谢:)
编辑:
因为我的目标是比较列表中共有1个元素的2个列表.我认为上面的代码是错误的.这是我的代码的更新
foreach($array_1 as $k){
if(in_array($k, $array_2)){
array_push($array_3, $k);
}
}
Run Code Online (Sandbox Code Playgroud)
我想这将是:
最佳案例:O(n)
最坏情况:O(N*M)
那么我们来快速分析一下:
foreach($array_1 as $k)
Run Code Online (Sandbox Code Playgroud)
意味着将对数组的每个元素重复其中的操作。让 表示数组的大小N
。
内操作:
if (!in_array($k, $array_2)) {
array_push($array_2, $k);
}
Run Code Online (Sandbox Code Playgroud)
这里有2个操作:
in_array
array_push
array_push
可能是常数,因此O(1)
, whilein_array
更可能是线性搜索,其中array_2
将进行 1 次操作(作为第一个元素找到)直至array_2
操作长度。
请注意,in_array
这里代表唯一的变量:
in_array
在第一次比较时返回 --> 的所有元素array_1
都相同,并且要么array_2
为空,要么等于其第一个元素。复杂性是O(N)
因为我们有N
元素array_1
array_2
--> 的每个元素时,所有元素array_1
都是不同的,并且它们与 之前的元素不同array_2
。如果M
是输入时的长度array_2
,那么复杂度沿着 的线O(N * (N+M) )
,是从到元素增长时(N+M)/2
搜索的平均时间,并且在符号中被丢弃的常量array_2
M
M+N
2
O
希望这可以帮助。