【问题标题】:The time complexity of quick select快速选择的时间复杂度
【发布时间】:2017-06-04 12:24:40
【问题描述】:

我读到快速选择的时间复杂度是:

T(n) = T(n/5) + T(7n/10) + O(n)

我将上述内容读作“从 n 个元素中快速选择所需的时间 =(从 7n/10 个元素中选择所需的时间)+(从 n/5 个元素中快速选择所需的时间)+(一些 const *n)”

所以我知道,一旦我们找到合适的枢轴,只剩下 7n/10 个元素,并且进行一轮安排枢轴需要时间 n。

但是 n/5 部分让我感到困惑。我知道这与中位数有关,但我不太明白。 根据我的理解,中位数的中位数递归地分成 5 并找到中位数,直到你得到 1。

我发现这样做所花费的时间大约是 n 所以妈妈的T(n)=n

如何让 quick_select(n) = T_mom(n)/5 的 T 相等?

换句话说,这就是我认为方程式应该这样写的:

T(n)= O(n)+n+T(7n/10)
where,
O(n) -> for finding median
n-> for getting the pivot into its position
T(7n/10) -> Doing the same thing for the other 7n/10 elements. (worst case)

谁能告诉我哪里出错了?

【问题讨论】:

  • 您在此处列出的时间复杂度看起来像是中位数的中位数,而不是快速选择。
  • 如果只是妈妈,为什么 7n/10 会在那里?

标签: algorithm time time-complexity quicksort median-of-medians


【解决方案1】:

在中位数部分的中位数中,我们做了如下操作:

  1. 取子列表的中位数,每个子列表最多有 5 个元素。对于每个列表,我们需要 O(1) 次操作,并且有 n/5 个这样的列表,因此总共需要 O(n) 才能找到每个列表的中位数。
  2. 我们取这 n/5 个中位数的中位数(中位数的中位数)。这需要 T(n/5),因为我们应该检查的只有 n/5 个元素。

所以中位数部分的中位数实际上是 T(n/5) + O(n),顺便说一句,T(7n/10) 部分和你说的不完全一样。

【讨论】:

    【解决方案2】:

    在此设置中,T(n) 是指在 n 个元素的数组上计算 MoM 所需的步骤数。让我们一步一步地检查算法,看看会发生什么。

    首先,我们将输入分成大小为 5 的块,对每个块进行排序,形成这些块的中位数的新数组,然后递归调用 MoM 以获取该新数组的中位数。让我们看看每个步骤需要多长时间:

    1. 将输入分成大小为 5 的块:这可以在 O(1) 时间内完成,只需将数组隐式划分为块而不移动任何内容。

    2. 对每个块进行排序:对任意大小的数组进行排序需要 O(1) 时间。有 O(n) 个这样的块(具体来说,⌈n / 5⌉),所以这需要时间 O(n)。

    3. 获取每个块的中位数并从这些中位数组成一个新数组。只需查看中心元素,即可在 O(1) 时间内找到每个块的中间元素。有 O(n) 个块,所以这一步需要时间 O(n)。

    4. 在该新数组上递归调用 MoM。这需要时间 T(⌈n/5⌉),因为我们正在对我们在上一步中形成的那个大小的数组进行递归调用。

    所以这意味着获得实际中位数的逻辑需要时间 O(n) + T(⌈n/5⌉)。

    那么 T(7n/10) 部分从何而来?好吧,算法的下一步是使用我们在步骤(4)中找到的中位数的中位数作为分区元素,将元素拆分为小于该枢轴的元素和大于该枢轴的元素。从那里,我们可以确定我们是否找到了我们正在寻找的元素(如果它在数组中的正确位置),或者我们是否需要在数组的左侧或右侧区域进行递归。选择块中位数的中位数作为分裂点的好处是它保证了在这一步中较小和较大元素之间的最坏情况 70/30 分裂,所以如果我们必须递归地继续算法,在最坏的情况下如果我们使用大约 7n/10 个元素这样做。

    【讨论】:

    • T(n/5) 是给妈妈的,T(7n/10) 是给下一步快速选择的。如果整个妈妈都发生在快速选择的每一步,这样写有什么道理?
    • 您必须将两个递归调用分开。对大小为 7n/10 的问题的调用将依次完成大量工作并触发它自己的递归调用,但是在编写递归关系时,我们只关注单个调用,并且它会立即触发调用。只有在解决重复问题时,我们才开始考虑所有这些调用是如何叠加的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多