【问题标题】:Randomized Quick Sort worst case Time Complexity随机快速排序最坏情况时间复杂度
【发布时间】:2018-01-28 12:23:39
【问题描述】:

当以下两种情况之一发生时,最坏情况下普通快速排序的时间复杂度为 O(n^2):

  1. 输入已按升序或降序排序
  2. 输入数组中的所有元素都相同

在上述两种情况下,PARTITION 算法会将数组分成两个子部分,一个包含 (n-1) 个元素,第二个包含 0 个元素

为了避免这种糟糕的情况,我们使用另一个版本的 QuickSort,即 Randomized Quick-Sort,其中选择一个随机元素作为枢轴。随机快速排序的预期 T.C 为 theta(nlogn)

我的问题是,对于什么输入/情况,随机快速排序会导致 O(n^2) 的最差时间复杂度?

【问题讨论】:

  • 如果随机枢轴选择器碰巧选择了例如连续N次最小的元素,您将获得最差的性能。这种特殊情况的概率约为 1/n!当然还有更多的案例需要考虑。

标签: algorithm sorting quicksort


【解决方案1】:

如果输入包含完全相同的元素,则随机快速排序的运行时间为 O(n^2)。这是假设您使用与确定性版本中相同的 PARTITION 算法。分析是相同的。

这是一个随机快速排序的实现,它计算执行的比较次数:

import random

def quicksort(A, lo, hi):
    if lo >= hi:
        return 0
    p, compares = partition(A, lo, hi)
    compares += quicksort(A, lo, p - 1)
    compares += quicksort(A, p + 1, hi)
    return compares

def partition(A, lo, hi):
    r = random.randrange(lo, hi+1)
    A[r], A[hi] = A[hi], A[r]
    pivot = A[hi]
    i = lo - 1
    compares = 0
    for j in xrange(lo, hi):
        compares += 1
        if A[j] < pivot:
            i = i + 1
            A[i], A[j] = A[j], A[i]
    compares += 1
    if A[hi] < A[i + 1]:
        A[i + 1], A[hi] = A[hi], A[i + 1]
    return i + 1, compares


for x in xrange(10, 510, 40):
    compares = quicksort([1] * x, 0, x-1)
    print x, compares

输出清楚地显示了 O(n^2) 运行时间:

10 54
50 1274
90 4094
130 8514
170 14534
210 22154
250 31374
290 42194
330 54614
370 68634
410 84254
450 101474
490 120294

【讨论】:

  • 即使所有元素都相同,随机分区树的深度仍然是O(lg n)。因此,即使所有输入都相同,随机快速排序也不会落入O(n ^ 2)
  • @taskinoor 将有一个大小为 n-1 的分区和一个大小为 1 的分区。随机化没有帮助,因为枢轴值总是相同的(因为所有元素都是相同的) .
  • 如果你按照你应该的方式划分成三个部分(x_ipivot),那么这种情况下的运行时间是 O(n)。
  • @n.m.是的,但从问题中可以清楚地看出,他们的 PARTITION 函数没有这样做。
  • @PaulHankin "如果随机枢轴选择器碰巧连续 N 次选择最小的元素,您将获得最差的性能。这种特殊情况的概率约为 1/n!"这种可能性是否也会导致随机快速排序的最坏情况TC?
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多