Algorithm 使用大O表示法时平均复杂度的含义

Algorithm 使用大O表示法时平均复杂度的含义,algorithm,complexity-theory,big-o,Algorithm,Complexity Theory,Big O,在回答一场关于快速排序的复杂性的辩论时,他开始发表评论。我在大学时代所记得的是,快速排序在最坏的情况下是O(n^2),在平均情况下是O(n log(n)),在最佳情况下是O(n log(n))(但界限更紧) 我需要的是对平均复杂度含义的正确数学解释,以便向那些认为big-O符号只能用于最坏情况的人清楚地解释它的含义 我记得如果要定义平均复杂度,你应该考虑所有可能输入的算法的复杂性,计算有多少退化和正常的情况。当n变大时,如果退化案例数除以n趋向于0,那么你可以说正常案例的整体函数的平均复杂度 这

在回答一场关于快速排序的复杂性的辩论时,他开始发表评论。我在大学时代所记得的是,快速排序在最坏的情况下是
O(n^2)
,在平均情况下是
O(n log(n))
,在最佳情况下是
O(n log(n))
(但界限更紧)

我需要的是对
平均复杂度
含义的正确数学解释,以便向那些认为big-O符号只能用于最坏情况的人清楚地解释它的含义

我记得如果要定义平均复杂度,你应该考虑所有可能输入的算法的复杂性,计算有多少退化和正常的情况。当n变大时,如果退化案例数除以n趋向于0,那么你可以说正常案例的整体函数的平均复杂度


这个定义是正确的还是平均复杂度的定义不同?如果它是正确的,有人能比我更严格地陈述它吗?

一般案例分析做以下几点:

获取固定长度的所有输入(例如
n
),将该长度的所有实例的所有运行时间相加,并建立平均值


问题是,您可能必须枚举所有长度
n
的输入,才能得出平均复杂度。

我认为您的定义是正确的,但您的结论是错误的

如果“坏”案例的比例趋于0,那么平均复杂度就等于“正常”案例的复杂度,这并不一定是真的

例如,假设1/(n^2)个案例为“坏”案例,其余案例为“正常”,并且“坏”案例恰好进行(n^4)次运算,而“正常”案例正好进行n次运算

那么所需的平均操作数等于:

(n^4/n^2) + n(n^2-1)/(n^2)
这个函数是O(n^2),但不是O(n)


然而,在实践中,您可能会发现时间在所有情况下都是多项式的,“坏”情况的比例呈指数级缩小。这时,在计算平均值时,您可以忽略不好的情况。

如果您正在寻找一个正式的定义,那么:

平均复杂度是随机输入的运行时间。

你说得对

大O(大θ等)用于测量函数。当你写f=O(g)时,f和g的意思并不重要。它们可以是平均时间复杂度、最坏时间复杂度、空间复杂度、表示素数分布等

最坏情况复杂性是一个大小为n的函数,它告诉您给定大小为n的输入的算法的最大步数是多少

平均案例复杂度是一个大小为n的函数,它告诉您给定大小为n的输入的算法的预期步数

正如您所看到的,最坏情况和平均情况复杂性都是函数,因此您可以使用大O来表示它们的增长。

让我们参考:

设f和g是定义在实数子集上的两个函数。如果

所以定义的前提是函数f应该以一个数字作为输入,并产生一个数字作为输出。我们在说什么输入号码?它应该是序列中要排序的许多元素。我们可以谈论什么输出数字?它可以是一系列的操作来对序列进行排序。但是停下来。什么是函数

函数是一组输入和一组允许输出之间的关系,其性质是每个输入仅与一个输出相关

我们是否在用先前的定义生成一个输出?不,我们没有。对于给定大小的序列,我们可以得到大量不同的操作。因此,为了确保定义适用于我们的案例,我们需要将一组可能的结果(操作数)减少为一个值。它可以是最大值(“最差情况”)、最小值(“最佳情况”)或平均值

结论是,讨论最佳/最差/平均情况在数学上是正确的,在排序复杂度上下文中使用大O表示法而不使用大O表示法有点草率


另一方面,我们可以更精确地使用大θ表示法而不是大O表示法。

关于这个论点,我认为如果你给运行时间以大O表示法,但没有限定它,那么你应该谈论最坏的情况,这仅仅是因为你们说时间是由一个具有指定大O的函数所限定的。若时间是有界的,那个就意味着最坏情况下的时间是有界的,根据“界”的定义。如果你说,“这是O(n logn)平均情况”,那么这是很好的定义,也就是你在这个问题上所说的。也许值得尝试一下question@Chris:尽管该网站的常见问题说“教科书中典型的家庭作业问题”太基本了,我认为这和那一样基本。你会在上面看到一页数学符号,而不是初学者friendly@ChrisS:我是一名程序员,但以前做过一些数学,所以这对我来说不是什么问题。但对其他人来说,拥有更容易接近的东西确实是件好事。好吧,我同意你的看法。我正按照你的建议计算平均值的复杂度。这甚至是我在对相关问题的评论中提出的演算。我说得太快了,我们保持正常情况,这显然并不总是正确的,这取决于退化情况的复杂性。按照我所说的,坏的情况甚至可能永远持续下去,程序永远不会停止,这对平均水平来说绝对不好。@Kris:是的,不停止的情况是一个比我更简单的例子,尽管从技术上讲,它不是你正在分析的“算法”。请引用。维基文章并没有直接的联系。事实上,我发现,+1对于你的答案,似乎(如果我们相信维基百科的话),正式的定义实际上是随机输入的