当前位置: 首页 > 知识库问答 >
问题:

最坏情况快速排序空间复杂性解释

凌昕
2023-03-14

我想展示Quicksort空间复杂性的最坏情况。

我在想它,快速排序不使用辅助数组,它只是在分区子程序上创建一些辅助变量,但它只是操作数组中的项目。所以,很明显,我的结论是它使用了O(n)空间。

但我在网上搜索发现,Quicksort在最坏情况下的空间复杂度为O(logn)。

我只是不明白为什么在最坏的情况下,它比输入数组占用的空间更少?

ps:我在看《算法导论》这本书。

我已经尝试的是计算算法中所有变量的声明。

QUICKSORT(A, p, r)
    if p < r
        q = partition(A, p, r)
        QUICKSORT(A, p, q - 1)
        QUICKSORT(A, q + 1, r)


PARTITION(A, p, r)
    x = A[r] // pivot
    i = p - 1
    for j = p to r - 1
        if A[j] <= x
            i = i + 1
            exchange A[i] with A[j]
    exchange A[i + 1] with A[r]
    return i + 1

共有3个答案

庞安晏
2023-03-14

在最坏的情况下,空间复杂度是O(n),而不是O(log n),即分区总是不平衡的;例如,一个分区总是大小为k,另一个分区总是大小为n-k,其中k是常数(例如1、2或3),n是每轮递归中要分区的数组的大小。

换句话说,在最坏的情况下,在每一轮递归中,总是有一个大小的分区

如果在最坏的情况下,您可以递归O(log n)轮以获得空间复杂度,但需要O(n)轮来获得时间复杂度,这将是不合逻辑的。

耿建弼
2023-03-14

如果像这样实现快速排序,那么最坏情况的空间复杂度是O(n):

QUICKSORT(A, p, r)
    if p < r
        q = partition(A, p, r)
        QUICKSORT(A, p, q - 1)
        QUICKSORT(A, q + 1, r)

但快速排序的真正实现从来都不是这样写的。它们是这样写的:

QUICKSORT(A, p, r)
    while p < r
        q = partition(A, p, r)
        if (q-p <= r-q)
            QUICKSORT(A, p, q - 1)
            p = q+1
        else
            QUICKSORT(A, q + 1, r)
            r = q-1

正如@YvesDoust所说,重要的是在较小的部分递归,然后在较大的部分循环(或尾部递归,但这是另一个故事)。

这样,每次递归调用的范围最多是调用者范围的一半,最大深度是O(log n)

郎玮
2023-03-14

在评估空间复杂度时,不计算输入存储,但计算堆栈深度。

在直接的QuickSort中,分区每次都非常不利,只能将子阵列减少一个元素。因此,空间复杂度为O(n)!(通常是灾难)。

因此,首先对最小的子数组进行递归并使用尾递归很重要。这将最坏情况降低到O(Log n)。

 类似资料:
  • 因为最坏情况下的快速排序复杂度为O(n^2) 在递增顺序的情况下,当pivot选择第一个或最后一个元素时,它给出了正确的最坏情况复杂度O(n^2),因为树的一个子元素总是空的 但是当枢轴选择中间时,我感到困惑?它将树分成两半,使其复杂性O(n.logn) 假设10 20 30 40 50 60 70枢轴=40 (10 20 30 ) 40 (50 60 70) 左侧枢轴20,右侧枢轴60 (10)

  • 本文向大家介绍快速排序的最优情况?相关面试题,主要包含被问及快速排序的最优情况?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 快速排序的最优情况是Partition每次划分的都很均匀,当排序的元素为n个,则递归树的深度为。在第一次做Partition的时候需对所有元素扫描一遍,获得的枢纽元将所有元素一分为二,不断的划分下去直到排序结束,而在此情况下快速排序的最优时间复杂度为。

  • 线性搜索所需时间的最坏情况是,该项位于列表/数组的末尾,或者不存在。在这种情况下,算法需要执行比较,以查看每个元素是否为所需值,假设是数组/列表的长度。 根据我对big-O表示法的理解,可以说这个算法的时间复杂度是O(n),因为最坏的情况可能发生,当我们想要保守估计“最坏的情况”时,可以使用big-O。 从堆栈溢出的许多帖子和答案来看,这种想法似乎是有缺陷的,像Big-O符号这样的说法与最坏情况分

  • 我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。 我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎