【问题标题】:Quicksort complexities in depth [closed]深度快速排序复杂性[关闭]
【发布时间】:2017-11-20 10:44:13
【问题描述】:

所以我正在参加考试,这次考试的很大一部分将是快速排序算法。众所周知,该算法的最佳情况,实际上是平均情况是:O(nlogn)。最坏的情况是O(n^2)

至于最糟糕的情况,我知道如何解释它:它发生在所选的枢轴是阵列中最小或最大的值时,我们将拥有n Quicksort呼叫可能需要达到ntime(我的意思是分区操作)。我说的对吗?

现在是最佳/平均情况。我读过 Cormens 的书,多亏了那本书,我明白了很多东西,但至于快速排序算法,他专注于如何解释 O(nlogn) 复杂性的数学公式。我只是想知道为什么是O(nlogn),而不是进行一些数学证明。现在我只看到了一些维基百科的解释,如果我们选择一个枢轴,每次将我们的数组分成n/2, n/2+1 部分,那么我们将有一个深度调用树logn,但我不知道是否这样是真的,即使是这样,那为什么是logn

我知道互联网上有很多关于快速排序的资料,但它们只涉及实现,或者只是告诉我复杂性,而不是解释它。

【问题讨论】:

  • 你了解log2是什么吗?你了解每一级递归将剩余工作一分为二的效果吗?
  • 是的,我得找一个号码k 比如2^k=n
  • 是的,所以如果你选择 n, n/2, n/4, n/8, ...,根据定义,就会有 log2(n) 项。
  • 每个都需要n时间,对吧?

标签: algorithm time-complexity quicksort partition logarithm


【解决方案1】:

我说的对吗?

是的。

我们会有一个深度调用树logn,但我不知道这是不是真的

是的。

为什么是logn

因为我们在每一步都将数组分成两半,导致调用图的logn 深度。来自这个Intro

查看树及其深度,它是logn。想象一下,BST 中的搜索成本为 logn,或者为什么在排序数组中的二进制搜索中搜索也需要 logn


PS:数学说真话,投资于理解它们,你将成为一名更好的计算机科学家! =)

【讨论】:

    【解决方案2】:

    对于最佳情况,快速排序在每个分区步骤中将当前数组拆分为 50% / 50%(一半),时间复杂度为 O(log2(n)) (1/.5 = 2),但常数 2 被忽略,所以它是 O(n log(n)。

    如果每个分区步骤产生 20% / 80% 的分割,那么最坏情况的时间复杂度将基于 80% 或 O(n log1.25(n)) (1/.8 = 1.25),但是常数 1.25 被忽略,所以它也是 O(n log(n)),尽管它比 50% / 50% 分区情况下对 100 万个元素进行排序慢了大约 3 倍。

    O(n^2) 时间复杂度发生在分区拆分仅在每个分区步骤中产生分区大小的线性减小时。最简单和最差的例子是每个分区步骤只删除 1 个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 2013-04-26
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多