对于3-way Quicksort(双枢轴快速排序),我如何才能找到Big-O绑定?有人能告诉我如何推导它吗?
答案 0 :(得分:2)
嗯,同样的证据确实存在。
每次迭代将数组拆分为3个子列表,平均每个子列表的大小为n/3
。
因此 - 所需的迭代次数为log_3(n)
,因为您需要查找(((n/3) /3) /3) ...
的次数,直到找到一次。这为您提供了公式:
n/(3^i) = 1
对i = log_3(n)
感到满意。
每次迭代仍然遍历所有输入(但在不同的子列表中) - 与quicksort相同,后者为您提供O(n*log_3(n))
。
自log_3(n) = log(n)/log(3) = log(n) * CONSTANT
起,您的平均运行时间为O(nlogn)
。
注意,即使您采用更悲观的方法来计算子列表的大小,通过采用最小均匀分布 - 它仍然会得到第一个大小为1/4的子列表,第二个子列表大小为1/2,并且大小为1/4的最后一个子列表(均匀分布的最小值和最大值),它将再次衰减到log_k(n)
次迭代(具有不同的k> 2) - 这将再次产生O(nlogn)
次。
正式,证明如下:
对于每个c_1* n
,对于某些常数c_1,N_1,每次迭代最多需要n>N_1
个运算。 (big O表示法的定义,以及每次迭代O(n)
不包括递归的说法。说服自己为什么这是真的。注意,在这里 - “迭代”意味着算法在某个“级别”完成的所有迭代,而不是在一个递归的调用中。)
如上所示,平均情况下你有log_3(n) = log(n)/log(3)
次迭代(在这里采用乐观版本,可以使用相同的悲观原则)
现在,我们得到算法的运行时间T(n)
:
for each n > N_1:
T(n) <= c_1 * n * log(n)/log(3)
T(n) <= c_1 * nlogn
截至definition of big O notation,表示T(n)
位于O(nlogn)
M = c_1
和N = N_1
。
的 QED 强>
答案 1 :(得分:2)
发现算法的复杂性与证明之间存在细微差别。
要查找此算法的复杂性,您可以像其他答案中所说的那样:您知道在平均值中,您可以分割大小问题{{ 1}}变成三个较小的大小n
的问题,所以你会在èlog_3(n)的平均步骤中得到大小为1的问题。根据经验,你会开始感受到这种方法和能够通过在涉及的子问题方面考虑算法来推断算法的复杂性。
要证明该算法在n/3
的平均情况下运行,您可以使用Master Theorem。要使用它,您必须编写递归公式,给出排序数组所花费的时间。正如我们所说,对大小为O(nlogn)
的数组进行排序可以分解为三个大小为n
的数组以及构建它们所花费的时间。这可以写成如下:
n/3
其中T(n) = 3T(n/3) + f(n)
是一个函数,为大小为T(n)
的输入提供分辨率“时间”(实际上是所需的基本操作数),n
给出了所需的“时间”将问题分解为子问题。
对于3-way quicksort,f(n)
,因为你通过数组,检查每个项目的放置位置并最终进行交换。这会将我们置于Case 2 of the Master Theorem,其中指出f(n) = c*n
对于某些f(n) = O(n^(log_b(a)) log^k(n))
(在我们的案例中为k >= 0
),那么
k = 0
作为T(n) = O(n^(log_b(a)) log^(k+1)(n)))
和a = 3
(我们从递归关系b = 3
获得这些),这简化为
T(n) = aT(n/b)
这是证明。