如何确定程序(算法)的最佳情况和最坏情况?

时间:2010-04-19 13:20:23

标签: php algorithm

假设我有这个程序,我想比较2个输入列表。假设数组A和数组B.如何确定函数的最佳情况和最坏情况?

这是我在[php]中的代码:

foreach($array_1 as $k){
    if(!in_array($k, $array_2)){
        array_push($array_2, $k);
    }
}   

for循环的最佳情况和最坏情况是什么?请包括一些解释,谢谢:)

编辑:

因为我的目标是比较列表中共有1个元素的2个列表。我认为上面的代码是错误的。这是我的代码的更新

foreach($array_1 as $k){
    if(in_array($k, $array_2)){
        array_push($array_3, $k);
    }
}

我猜它会是:

最佳案例:O(n)

最坏情况:O(N * M)

3 个答案:

答案 0 :(得分:2)

让我们快速分析一下:

foreach($array_1 as $k)

表示将对阵列的每个元素重复其中的操作。让我们用N来表示数组的大小。

其中的操作:

if (!in_array($k, $array_2)) {
  array_push($array_2, $k);
}

这里有2个操作:

  • in_array
  • array_push

array_push可能是常数,因此O(1),而in_array更可能是array_2中的线性搜索,它将进行1次操作(作为第一次发现) element)最多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_2M的平均搜索时间}它从M+N增长到2元素,而O符号中的常量{{1}}被丢弃

希望这有帮助。

答案 1 :(得分:1)

Big O符号完全是近似值。它可以很容易地比较算法。

如果您想象您的元素数组,搜索可能是订单N(您必须查看每个项目以找到您想要的项目),如果您有订购的集合,它可能是订单Log(N),或者它甚至可以根据你的收藏类型,订购1。

这里重要的是查看您的算法并确定重复的关键操作。

Foreach显然是一个N阶操作,根据定义,您必须对列表中的每个元素进行操作。 O(N)

接下来是你的if InArray 2.这听起来像是对数组的搜索,这很可能是无序的,因此它将是N阶(线性搜索)。所以你的复杂性现在是O(N * M)。 (对于数组1中的每个n个元素,在数组2上执行N次序复杂度的搜索)。

最后你有一个数组推送。我不知道您的环境,但如果需要重新分配和复制数组以便增长,则可以是订单1或订单N.让我们假设订单1以保持简单。因此,Big O的复杂度为O(N * M)。

所以现在最好的情况是每个元素在第一次尝试时找到它的对应物并执行数组推送,即O(N * 1 * 1)= O(N)。

最坏的情况是在第二个列表中找不到每个元素,强制完全搜索数组2中的所有元素。因此复杂度为O(N * M)。

你的老师想要了解你的想法,所以告诉他们你的假设。我强烈建议您在依赖此处给出的假设之前阅读您所提供的确切问题和信息,您可能已经被告知语言/平台会告诉您每种情况下使用的确切惩罚和算法。希望有所帮助:)

答案 2 :(得分:0)

一般来说,这个问题我只是把算法看作是Evil博士,然后问:“我怎样才能让时间成为可能?”