在回答this question时,一场辩论开始于关于QuickSort复杂性的评论。我在大学时间记得的是,在最糟糕的情况下,QuickSort为O(n^2)
,平均情况为O(n log(n))
,O(n log(n))
(但最严格的约束)。
我需要的是对average complexity
含义的正确数学解释,以清楚地解释对于那些认为大O符号只能用于最坏情况的人来说是什么。
我记得如果要定义平均复杂度,您应该考虑所有可能输入的算法复杂度,计算有多少退化和正常情况。如果当n变大时,退化情况除以n的数量趋向于0,则可以说正常情况下整体函数的平均复杂度。
这个定义是正确的还是平均复杂度的定义不同?如果它是正确的,有人可以比我更严格地陈述它吗?
答案 0 :(得分:9)
你是对的。
Big O(大Theta等)用于衡量功能。当你写f = O(g)时f和g意味着什么并不重要。它们可能是平均时间复杂度,最差时间复杂度,空间复杂性,表示素数的分布等。
最坏情况复杂性是一个大小为n的函数,它会告诉您在给定大小为n的情况下算法的最大步数是多少。
平均大小写复杂度是一个大小为n的函数,它会告诉您在给定大小为n的输入时算法的预期步数。
如您所见,最坏情况和平均情况复杂性是函数,因此您可以使用大O来表示它们的增长。
答案 1 :(得分:4)
如果您正在寻找正式的定义,那么:
平均复杂度是随机输入的expected运行时间。
答案 2 :(得分:1)
我认为你的定义是正确的,但你的结论是错误的。
如果“坏”案例的比例趋于0,那么平均复杂性等于“正常”案件的复杂性并不一定正确。
例如,假设1 /(n ^ 2)个案件为“坏”而其余为“正常”,而“坏”案件则完全采用(n ^ 4)个案件,而“正常”案件则为n操作
然后所需的平均操作次数等于:
(n^4/n^2) + n(n^2-1)/(n^2)
此函数为O(n ^ 2),但不是O(n)。
但实际上,在所有情况下,您可能会发现时间是多项式的,而“坏”案例的比例会呈指数级缩小。那是你在计算平均值时忽略不良情况的时候。
答案 3 :(得分:0)
平均案例分析执行以下操作:
获取固定长度的所有输入(例如n
),总结此长度的所有实例的所有运行时间,并构建平均值。
问题是你可能需要枚举所有长度为n
的输入,以便得出平均复杂度。
答案 4 :(得分:0)
让我们参考Big O Notation in Wikipedia:
设f和g是在实数的某个子集上定义的两个函数。一个人写
f(x)=O(g(x)) as x --> infinity
如果......
那么定义的前提是,函数f应该将一个数作为输入并产生一个数作为输出。我们在谈论什么输入数字?据推测,序列中有许多要排序的元素。我们可以谈论什么输出数字?它可以是为了对序列进行排序而进行的许多操作。但是停下来。什么是功能? Function in Wikipedia:
函数是一组输入和一组允许输出之间的关系,其属性是每个输入与恰好一个输出相关。
我们之前的定义是否正在生成 exacly one 输出?不,我们不是。对于给定大小的序列,我们可以获得大量的操作变化。因此,为了确保定义适用于我们的案例,我们需要将一组可能的结果(操作数)减少到单个值。它可以是最大值("更糟糕的情况"),最小值("最佳情况")或平均值。
结论是,谈论最佳/最差/平均情况在数学上是正确的并且在没有排序复杂性的情况下使用大O表示法有点草率。
另一方面,我们可以更精确,使用大的Theta符号而不是大O符号。