快速排序时间复杂性

时间:2012-08-15 04:08:14

标签: java c++ algorithm time-complexity quicksort

我最近读到了时间复杂度,我发现Quick sort的平均时间复杂度为 O(nlog(n))

问题1:我不明白的是时间复杂度方程中 log(n)是如何出现的?

问题2:为什么我们总是使用大O 表示法来查找算法的时间复杂度?为什么我们不使用其他符号呢?

4 个答案:

答案 0 :(得分:10)

logn如何进入复杂性公式?

  • 对于每个步骤,您将在第一个和第二个半部分递归调用算法。
  • 因此 - 所需的步骤总数,是指每个步骤将问题排除2后从n1所需的步骤数。
    所以你实际上正在寻找一个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更丰富,则可能需要更多的操作)。
绝对不是使用的唯一的方法。对于实际应用,精确运行时间(以秒为单位)是非常重要的因素,并且经常使用。

因此,简而言之 - 大O符号使我们易于计算 - 平台无关近似算法将如何渐近地(在无穷大处)行为,这可以将算法的“族”划分为其复杂性的子集,让我们他们之间很容易比较。

此外,使用的其他表示法是small o, theta and big/small omega

答案 1 :(得分:1)

请阅读Introduction to Algorithms by Cormen et al。在第3章中,您将找到关于算法复杂性分析的一个很好的解释。您会发现Big O不是唯一使用的渐近符号。

答案 2 :(得分:1)

即使这是一个关于计算机科学的更多问题,可以通过对问题的评论更彻底地解释 -

问题1:log(n)表示问题按比例因子log(n)以比O(n)问题更高的速率扩展。小于n * log(n)(如n)的项被省略,因为它们比最大项缩放得慢。

问题2:还有其他指标,O(大O)是问题扩展的最坏情况。请参阅评论中的书籍链接,了解其他人/他们的意思,因为在那里可以更好地解释。

答案 3 :(得分:1)

问题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表示法,因为它提供了最坏情况时间复杂度的概念,即使参数趋于无穷大也限制了算法,这意味着算法至少会在这个时间复杂度中运行,并且不能超越它。 / p>

虽然还有其他符号如小o,theta和大/小omega经常使用,因为它们的应用有限。