Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定算法的最坏情况复杂度_Algorithm_Complexity Theory_Time Complexity - Fatal编程技术网

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

Algorithm 确定算法的最坏情况复杂度,algorithm,complexity-theory,time-complexity,Algorithm,Complexity Theory,Time Complexity,有人能给我解释一下如何确定算法的最坏情况复杂度吗。我知道我们需要使用方程W(n)=max{t(I)|I元素D),其中D是大小为n的输入集。我是否要计算每个元素I执行的操作数,然后取其最大值?有什么更简单的方法来实现这一点?从等式开始,我们的想法有点倒退。您真正关心的是可伸缩性,或者,随着您的增加,它将做什么e输入的大小 例如,如果你只有一个循环,你就有一个O(n)时间复杂度算法。如果你在另一个循环中有一个循环,它就变成了O(n^2),因为它现在必须为任何大小的n输入做n^2很多事情 当你谈论最坏

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

从等式开始,我们的想法有点倒退。您真正关心的是可伸缩性,或者,随着您的增加,它将做什么e输入的大小

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

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

对于(int i=0;i.5)j=n; } }


我们可以说,最坏的情况是O(n^2)。尽管我们知道中间循环很可能会提前爆发,但我们正在寻找最差的性能。

该等式更像是一个定义,而不是一个算法

所讨论的算法是否只关心输入的大小?如果不关心,那么计算W(n)是“容易的”

如果是,请尝试提出一个病理输入。例如,使用快速排序,排序后的输入很明显是病理输入,您可以进行一些计数,以确定它需要O(n^2)个步骤。此时,您可以

  • 争辩说你的输入是“最大限度的”病态的
  • 在运行时对任何输入显示匹配的上限
  • #1的示例:

    每次快速排序都会将轴放在正确的位置,然后在两个部分上递归。(handwave alert)最坏的情况是将数组的其余部分放在轴的一侧。经过排序的输入可以实现这一点

    #2的示例:

    每次快速排序都会将轴放在正确的位置,因此不会超过O(n)次。每次排序所需的工作量不超过O(n)。因此,任何输入都不会导致快速排序超过O(n^2)


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

    只需注意非确定性。循环提前终止不是非确定性的……确定性指的是能够明确知道程序将做什么,而不是无法确定它将做什么。概率或随机算法将是非确定性的,因为存在一个step在算法中,你不知道会发生什么(我不是说随机数,而是指随机算法)。非确定性和随机性之间有着明显的区别和密切的联系。就都灵机器而言,我们认为随机算法可以访问(无限)随机数磁带。如果你修复了随机磁带(你的随机种子)上的内容,其余部分是确定性的。但是,非确定性图灵机可以在给定固定输入的情况下从一种状态移动到其他几种状态。