确定算法的最坏情况复杂性

时间:2009-05-11 20:09:37

标签: algorithm complexity-theory time-complexity

有人可以向我解释如何确定算法的最坏情况复杂性。我知道我们需要使用等式W(n)= D的最大{t(I)| I元素),其中D是大小为n的输入集。我是否计算每个元素I执行的操作数,然后计算其最大值?有什么更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

从等式开始考虑它有点倒退。您真正关心的是可伸缩性,或者,当您增加输入的大小时,它将会做什么。

例如,如果你只有一个循环,那么你有一个O(n)时间复杂度算法。如果你在另一个循环中有一个循环,它会变成O(n ^ 2),因为它现在必须为任何大小的n输入做n ^ 2很多事情。

当你谈论最坏的情况时,你通常会谈论非确定性算法,你可能有一个可以过早停止的循环。您想要做的是假设最坏的情况并假装循环将尽可能晚地停止。如果我们有:

  

for(int i = 0; i< n; i ++){      for(int j = 0; j< n; j ++){         if(rand()> .5)j = n;      }   }

我们会说最坏的情况是O(n ^ 2)。尽管我们知道中间环很可能会早早出现,但我们正在寻找最差的性能。

答案 1 :(得分:0)

这个等式更像是一个定义而不是算法。

有问题的算法是否关心除输入大小以外的任何其他内容?如果没有那么计算W(n)是“容易的”。

如果是,请尝试提出病理输入。例如,使用quicksort可能很明显,排序的输入是病态的,您可以进行一些计数以查看它需要O(n ^ 2)步。那时你可以

  1. 认为你的输入是“最大的”病态
  2. 在任何输入上显示运行时的匹配上限
  3. #1的例子:

      

    快速排序的每次传递都会将枢轴放在正确的位置,然后递归两部分。 ( handwave alert )最糟糕的情况是将数组的其余部分放在数据透视的一侧。已排序的输入可实现此目的。

    #2的例子:

      

    quicksort的每次传球都会将枢轴放在正确的位置,所以只有O(n)次传球。每次通过只需要O(n)工作。因此,没有输入可以导致快速排序超过O(n ^ 2)。

    在这种情况下,#2更容易。