快速排序时间复杂度[关闭]

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)快速排序堆排序归并排序其他排序希尔排序计数排序

排序算法(快速排序)

排序算法——快速排序的图解代码实现以及时间复杂度分析

高级排序java实现(希尔归并快速)