繁体   English   中英

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

[英]Determining the worst-case complexity of an algorithm

有人可以向我解释一下如何确定一种算法的最坏情况下的复杂度。 我知道我们需要使用等式W(n)= max {t(I)| I D的元素),其中D是大小为n的输入集。 我是否要计算每个元素I的运算数量,然后取其最大值? 有什么更简单的方法可以做到这一点?

从等式开始,对它的思考有些倒退。 您真正关心的是可伸缩性,或者说,随着输入大小的增加,它将做什么。

例如,如果只有一个循环,则有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)。 即使我们知道中间循环很可能会尽早消失,我们仍在寻找可能的最差性能。

该方程式更多的是定义而不是算法。

除了输入大小以外,所讨论的算法是否还关心其他任何内容? 如果不是,则计算W(n)是“容易的”。

如果是这样,请尝试提出病理输入。 例如,使用quicksort可能很明显地是,已排序的输入是病理性的,您可以做一些计数以查看它采取了O(n ^ 2)个步骤。 那时您可以

  1. 认为您的输入“最大程度”是病理性的
  2. 在任何输入上展示运行时的匹配上限

#1的示例:

每次快速排序都会将关键点放在正确的位置,然后递归到这两个部分。 (手波警报 )最坏的情况是将阵列的其余部分放在枢轴的一侧。 排序的输入可实现此目的。

#2的示例:

快速排序的每个遍历将关键点放置在正确的位置,因此最多只能有O(n)个遍。 每次通过不超过O(n)个工作。 因此,没有任何输入会导致快速排序的花费超过O(n ^ 2)。

在这种情况下,#2要容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM