有人可以向我解释如何确定算法的最坏情况复杂性。我知道我们需要使用等式W(n)= D的最大{t(I)| I元素),其中D是大小为n的输入集。我是否计算每个元素I执行的操作数,然后计算其最大值?有什么更简单的方法来实现这一目标?
答案 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的例子:
快速排序的每次传递都会将枢轴放在正确的位置,然后递归两部分。 ( handwave alert )最糟糕的情况是将数组的其余部分放在数据透视的一侧。已排序的输入可实现此目的。
#2的例子:
quicksort的每次传球都会将枢轴放在正确的位置,所以只有O(n)次传球。每次通过只需要O(n)工作。因此,没有输入可以导致快速排序超过O(n ^ 2)。
在这种情况下,#2更容易。