【问题标题】:depth of recursion and one fact?递归深度和一个事实?
【发布时间】:2021-03-11 15:31:00
【问题描述】:

我看到了这段文字:

出现一个问题:

但是你在正常的快速排序中看到,当我们在一个子数组中有 1 个元素并且在下一个子数组中有 n-1 个元素时,我们在使用堆栈时会得到 O(n) 的深度。这与这个事实相反吗?问题出在哪里?

我对这个话题的误解在哪里?

【问题讨论】:

  • 不是问这个问题的正确地方
  • 常数分数类似于1/10。如果您只在子数组中放入 n 元素中的 1 个,那就是 1/n,一个非常数分数。一个常数分数会将线性数量的元素移动(对于足够大的n)到一个分区或另一个分区中。
  • 在正常的快速排序中,当每次都选择最坏的枢轴情况时,您将获得深度 n,而不仅仅是一次。最坏的情况发生在例如:1)数据已经按正向或反向排序,2)所有元素都相同,3)每次都选择最大值作为枢轴。
  • @DarrylG。这句话以if开头。但我们知道,在随机快速排序中,堆栈深度从未超过 O(log n)。那么为什么要从 if 开始呢?也许随机产生一种情况,其中一方不是恒定分数?

标签: python algorithm sorting data-structures quicksort


【解决方案1】:

您误解了“常数分数”的含义。这并不意味着您将恒定 number 个元素放在一个分区中,而将其余元素放在另一个分区中。如果将k 元素放在一个分区中,则分数k/n不是常量。

另一方面,如果您总是将1/k 元素(对于某些常量k)放在一个分区中,那么对于足够大的n,这是一个线性 数量的元素。对于k = 100000,一侧仍然是n/100000 元素,另一侧是99999/100000 n 元素。

【讨论】:

  • 我们知道。随机快速排序可以选择最小值或最大值作为枢轴,这可能(取决于将枢轴分配给哪一半)导致根本没有分支。
【解决方案2】:

重要的部分是“元素的常数分数”。如果遇到退化的快速排序情况,其中分区将常量 number(例如 1)个元素放在分区的一侧,您将获得 O(n^2) 时间复杂度。

但是,如果每个分区调用都在一侧放置一个恒定的分数(例如 99%)元素,您仍然会得到 O(n log n)(尽管具有更大的常数因子)。

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2021-10-28
    • 2015-02-28
    • 2010-10-25
    • 2018-06-30
    • 1970-01-01
    • 2016-02-28
    • 2021-11-22
    相关资源
    最近更新 更多