【问题标题】:Proof of Ω(n logk) worst case complexity in a comparison sort algorithm比较排序算法中 Ω(n logk) 最坏情况复杂度的证明
【发布时间】:2016-01-31 23:01:06
【问题描述】:

我正在编写一个比较算法,它以 n 个数字和一个数字 k 作为输入。

它将 n 个数分成 k 个组,使组 1 中的所有数都小于组 2 的所有数,...,小于组 k。

同一组的数字不一定是排序的。

我正在使用 selection(A[],left,right,k) 来查找第 k 个元素,在我的例子中是 n/k 元素(将整个数组分成 2 部分)和然后对每一部分重复,直到初始数组被分成 k 个部分,每个部分有 n/k 个数字。

它的复杂度为 Θ(n logk),因为它是一个 logk 级别(深度)的树,每个级别花费最大 cn 计算。这是线性时间,因为 logk 被认为是一个常数。

我被要求证明以这种方式将 Array[n] 排序到 k 个组的所有比较算法在最坏的情况下花费 Ω(nlogk)。

我在这里搜索过,谷歌和我的算法书(Jon Kleinberg Eva Tardos)我只找到了对所有元素进行排序的比较算法的证据。这种算法复杂性的证明在我的案例中是不被接受的,因为所有这些都是在不满足我的问题的情况下,也不能改变它们来满足我的问题。 (还要考虑随机选择的常规快速排序会导致 Θ(nlogn) 与 Ω(nlogk) 不是线性的)

您可以在此处找到通用算法证明: https://www.cs.cmu.edu/~avrim/451f11/lectures/lect0913.pdf 其中也清楚地解释了为什么我的问题不属于 O(nlogn) 的比较排序情况

【问题讨论】:

  • 这可能更适合cs.stackexchange.com
  • 矛盾证明:更好的下限适用于k=n,这将证明是基于比较的排序的更好下限。

标签: algorithm sorting selection complexity-theory quicksort


【解决方案1】:

排序需要lg(n!) = Omega(n log n) 比较,因为有n! 不同的输出排列。

对于这个问题有

   n!
-------
      k
(n/k)!

输出排列的等价类,因为k 独立组n/k 元素中的顺序无关紧要。我们计算

      n!
lg ------- = lg (n!) - k lg((n/k)!)
         k
   (n/k)!

           = n lg n - n - k ((n/k) lg (n/k) - n/k) ± O(lg n + k lg (n/k))
             (write lg (...!) as a sum, bound with two integrals;
              see https://en.wikipedia.org/wiki/Stirling's_approximation)

           = n (lg n - lg (n/k)) ± O(lg n + k lg (n/k))

           = n lg k ± O(lg n + k lg (n/k))

           = Omega(n lg k).
             (O(lg n + k lg (n/k)) = O(n), since k <= n)

【讨论】:

    【解决方案2】:

    证明所有以这种方式将 Array[n] 排序到 k 组的比较算法在最坏的情况下花费 Ω(nlogk)。

    我认为这种说法是错误的。如果在枢轴选择不佳的情况下使用快速选择(例如始终使用第一个或最后一个元素),那么最坏的情况可能是 O(n^2)。

    只有一些比较算法会出现 O(n log(k)) 的最坏情况。使用中位数的中位数(n/5 版本)作为枢轴可防止快速选择解决枢轴问题。还有其他算法也是 O(n log(k))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多