快速选择的时间复杂度

时间:2017-01-19 17:24:23

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

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

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

我读了上面的东西"从n个元素中快速选择的时间=(从7n / 10个元素中选择的时间)+(从n / 5个元素中快速选择的时间)+(一些常量* N)"

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

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

我发现这样做的时间大约是n 所以妈妈的(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)

有人可以告诉我哪里出错了?

2 个答案:

答案 0 :(得分:0)

在此设置中,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⌉),因为我们正在对我们在上一步中形成的那个大小的数组进行递归调用。

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

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

答案 1 :(得分:-1)

在中位数的中位数,我们执行以下操作:

  1. 取每个子列表的中位数,每个子列表最多包含5个元素。对于每个列表,我们需要O(1)运算,并且有n / 5个这样的列表,所以完全需要O(n)才能找到每个列表的中位数。
  2. 我们取n / 5个中位数的中位数(中位数的中位数)。这需要T(n / 5),因为我们应该检查只有n / 5个元素。
  3. 所以中位数的中位数实际上是T(n / 5)+ O(n),顺便说一句,T(7n / 10)部分并不完全如你所说。