快速排序时间复杂度[关闭]
Posted
技术标签:
【中文标题】快速排序时间复杂度[关闭]【英文标题】:Quick sort time complexity [closed] 【发布时间】:2012-08-15 04:08:13 【问题描述】:我最近阅读了有关时间复杂度的文章,发现快速排序的平均时间复杂度为 O(nlog(n))。
问题 1:我不明白的是,log(n) 是如何出现在时间复杂度方程中的?
问题 2:为什么我们总是使用 big O 符号来计算算法的时间复杂度?我们为什么不使用其他符号?
【问题讨论】:
1:不代表时间,只是将算法分类为函数:wolframalpha.com/input/?i=log2%28n%292:见(1) @Flavius 你能解释一下算法的分类吗? 这里不适合这类问题。参加计算机科学课程,或在线观看:aduni.org/courses “为什么我们总是使用大 O 符号来计算算法的时间复杂度?”...“我们”不这样做。 注意@paddy 的评论:它是“2 倍”和“一半”,因为当计算机科学家说log
时,他们真正的意思是log_2
。
【参考方案1】:
logn
是如何进入复杂度公式的?
因此 - 所需的总步数是从n
到达1
所需的次数,如果您将问题每一步除以 2。
所以你实际上是在寻找k
这样:
n / 2 /2 / 2 / ... /2 = 1
^
(k times)
但是,请注意,等式实际上是:n / 2^k = 1
。由于2^logn = n
,我们得到k = logn
。所以算法需要的步数(迭代)是 O(logn),这将使算法O(nlogn)
- 因为每次迭代都是O(n)
。
注意:这里的复杂性并不精确,在极少数情况下快速排序会衰减到O(n^2)
,这取决于枢轴选择。 “将问题每步除2”是一种简化,但不会改变算法的平均分析。
为什么要使用大 O 符号? 它简单且独立于平台。 op(有时甚至是比较)的确切数量取决于平台。 (如果指令集 A 比指令集 B 更丰富,它可能需要更多操作)。 这绝对不是 only 使用的方法。对于现实生活中的应用程序,确切的运行时间(以秒为单位)是非常重要的因素,并且经常被使用。
因此,简而言之 - 大 O 表示法使我们易于计算 - 算法将如何渐近(在无穷大处)表现的独立于平台的近似,它可以将算法的“家族”划分为其复杂性的子集,让我们轻松比较它们。
另外,使用的其他符号是small o, theta and big/small omega。
【讨论】:
【参考方案2】:问题1.快速排序的最坏情况时间复杂度是O(n^2),而平均情况复杂度是O(nlogn)。 logn 因子取决于枢轴,算法如何选择它。
快速排序最坏情况的时间复杂度发生在枢轴产生两个区域,一个元素大小为 1,另一个元素大小为 (n-1) n/2.
所以产生的递归关系是T(n)=2T(n/2)+Θ(n)。
f(n)=Θ(n)
h(n)=n^log2(2)=>n
since f(n) = h(n) so
T(n)= f(n)logn =>n(logn).
(这里我们使用 Θ 表示法,因为快速排序的最坏情况复杂度(大 O)是 O(n^2),这里我们计算的是平均情况复杂度。)
问题 2. 我们使用大 O 表示法,因为它给出了最坏情况时间复杂度的概念,即使参数趋于无穷大,它也会限制算法,这意味着算法至少会在这个时间复杂度下运行并且不能超过它。
而还有其他符号,例如小 o、theta 和大/小 omega,由于应用有限,因此经常使用。
【讨论】:
【参考方案3】:请阅读Introduction to Algorithms by Cormen et al。在第 3 章中,您将找到关于算法复杂性分析的一个很好的解释。您会发现 Big O 并不是唯一使用的渐近符号。
【讨论】:
【参考方案4】:尽管这更多是关于计算机科学的一般问题,但问题上的 cmets 可以更彻底地解释 --
问题 1:log(n) 表示问题的扩展率比 O(n) 问题高一个因子 log(n)。小于 n*log(n) 的项(如 n)被省略,因为它们的缩放比最大项慢。
问题2:还有其他指标,O(大O)是问题扩展的最坏情况率。请参阅 cmets 中的书籍链接以了解其他内容/意思,因为那里有更好的解释。
【讨论】:
它没有回答“logn 是如何到达那里的”它回答了一个不同的问题:“它有什么影响?” @amit 是的,尽管他的问题含糊不清,所以不清楚他是在问为什么快速排序是 O(nlogn) 还是为什么 T(nlogn) 没有映射到 O(n)。他似乎没有从他在问题中写的内容中理解 O 符号的含义。我相信其他答案解决了快速排序如何达到 O(nlogn),所以我将留下答案,以涵盖对他最初的第一个问题的可能解释。以上是关于快速排序时间复杂度[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
排序算法时间复杂度O(n^2)冒泡排序选择排序插入排序时间复杂度O(nlogn)快速排序堆排序归并排序其他排序希尔排序计数排序