我知道最坏/平均/最佳情况用于确定函数中算法的复杂度时间,但这在渐近分析中是如何使用的?我知道上限/紧/下限(大O,大ω,大θ)用于比较两个函数,并随着n的增加,从另一个函数的角度来看它的极限(增长)是什么,但我很难看到最坏/平均/最佳情况下的大O和渐近分析之间的区别。将我们的最坏/avg/最佳情况下的大O输入渐近分析和测量界,我们到底能得到什么?我们会使用渐近分析来具体比较最坏/avg/最佳情况下大O的两种算法吗?如果是,我们对算法1使用函数f(n),对算法2使用函数g(nf(n),然后对算法2做同样的事情。我在这里看不到大局。
既然你想要大局,让我试着给你同样的结果
渐近分析用于研究运行时间如何随着输入大小的增加而增长。这种增长是根据投入规模来研究的。输入大小,通常表示为N或M,它可以表示从数字数量(如排序)、节点数量(如图)甚至比特数量(如两个数字的乘积)中的任何值
在进行渐近分析时,我们的目标是找出哪种算法在特定情况下效果更好。要意识到,即使对于相同大小的输入,算法也会在不同的时间运行。要理解这一点,请考虑你是一台分拣机。你会得到一组数字,你需要对它们进行排序。如果我给你一个排序的数字列表,你就没有工作了,而且你已经完成了。如果我给你一个反向排序的数字列表,想象一下你需要做多少操作才能使列表排序。现在你看到了这一点,意识到我们需要一种方法来知道输入是什么情况?这是最好的情况吗?我会得到最坏情况的输入吗?为了回答这个问题,我们需要一些关于输入分布的知识。这会是最糟糕的情况吗?还是一般情况?还是大多数情况下都是最好的
在大多数情况下,输入分布的知识很难确定。然后我们就剩下两个选择了。要么我们可以一直假设平均情况并分析我们的算法,要么我们可以得到运行情况的保证,而不考虑输入分布。前者被称为平均案例分析,要进行这样的分析,需要对什么是平均案例进行正式定义。有时这很难定义,需要大量的数学洞察力。所有的麻烦都是值得的,当你知道一些算法在平均情况下比最坏情况下的运行时间运行得更快时。有几种随机算法证明了这一点。在这种情况下,进行平均案例分析可以揭示其实际适用性。后者,最坏情况分析更经常使用,因为它为运行时间提供了很好的保证。在实践中,想出最坏的情况往往是相当直观的。假设你是排序机器,最坏的情况就像反向排序的数组。平均情况是什么
是的,你在想,对吧?不那么直观
很少使用最佳案例分析,因为并不总是得到最佳案例。仍然可以进行这样的分析并发现有趣的行为
总之,当我们有一个我们想解决的问题时,我们会想出算法。一旦我们有了算法,我们就需要决定它是否对我们的情况有任何实际用途。如果是这样的话,我们继续筛选可以应用的算法,并根据它们的时间和空间复杂性进行比较。可以有更多的指标进行比较,但这两个是基本的。一个这样的度量标准可能是易于实现。根据目前的情况,余将采用最坏情况分析或平均情况分析或最佳情况分析。例如,如果你很少有最坏的情况,那么进行平均情况分析更有意义。然而,如果我们代码的性能是关键性的,并且我们需要在严格的时间限制内提供输出,那么查看最坏情况分析会更加谨慎。因此,你所做的分析取决于手头的情况,随着时间的推移,应用哪种分析的直觉成为第二天性
如果您还有其他问题,请询问。
要了解更多关于大哦和其他符号的信息,请阅读我的答案。
维基百科上关于快速排序的文章提供了一个很好的例子,说明渐近分析是如何在最佳/平均/最坏情况下使用的:它有O(n^2)的最坏情况、O(n-logn)的平均情况和O(n-log n)的最佳情况,如果你将其与另一种算法(比如,堆排序)进行比较,你会将苹果与苹果进行比较,例如,你可以将quicksort的最坏情况大θ与heapsort的最差情况大θ进行比较,或者将quicks排序的空间大哦与heaps排序的空间小哦进行比较。
如果你对上界感兴趣,你也可以把大θ和大哦进行比较,如果你对下界感兴趣,可以把大theta和大omega进行比较。
大ω通常只是理论上的兴趣——你更有可能看到大哦或大θ的分析。
将最坏/平均/最佳情况下的大O输入渐近分析和测量边界,我们能得到什么
它只是在比较某个问题的不同方法时给出一个想法。这将帮助您比较不同的方法。
我们会使用渐近分析来具体比较最坏/平均/最佳情况下大O的两种算法吗
一般来说,只有更坏的情况才能得到更多的关注,相比之下,大欧米茄和θ。是的,我们对算法1使用函数f(n),对算法使用函数g(n)。这些函数是它们各自算法的大O。