快速排序时间复杂度

Quick sort time complexity

本文关键字:时间复杂度 快速排序      更新时间:2023-10-16

我最近读了关于时间复杂度的文章,我发现快速排序的平均时间复杂度为O(nlog(n))。

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

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

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表示法?
它简单且独立于平台。
操作的确切数量(有时甚至是比较)取决于平台。(如果指令集 A 比指令集 B 更丰富,则可能需要更多操作)。
这绝对不是使用的唯一方法。对于现实生活中的应用,确切的运行时间(以秒为单位)是非常重要的因素,并且经常使用。

因此,简而言之 - 大 O 符号让我们易于计算 - 关于算法将如何渐近(在无穷大处)的行为与平台无关的近似值,这可以将算法的"家族"划分为它们复杂性的子集,让我们轻松地在它们之间进行比较。

此外,使用的其他符号是小o,theta和大/小欧米茄。

Ques 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,θ和大/小欧米茄,由于它们的应用有限,因此经常使用。

请阅读Cormen等人的算法简介。在第3章中,您将找到有关算法复杂性分析的良好解释。 你会发现大O并不是唯一使用的渐近符号。

尽管这更像是一个关于计算机科学的问题,可以通过对这个问题的评论来更彻底地解释——

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

问题

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