假设你有一个黑盒子程序,它可以在(log n)^a
时间内从0 <= a <= 1
时间的n个元素数组中提取最大值。A[1, n-1]
。您正在尝试创建一个使用此子例程的最佳排序算法。
显而易见的解决方案是在整个数组上调用子例程,将max与最后一个元素交换,然后在A[1, 2]
上通过n*(log n)^a
迭代地调用子例程。
是否有更好的算法运行速度超过{{1}}时间,或者显而易见的解决方案是否最佳?
答案 0 :(得分:4)
没有。在期望中,我们需要来自黑盒子的Ω(n log n)位来排序n个项目。当在大小为k的数组上调用时,黑盒子运行(log k) a 步骤并返回大约log k位,速率约为(log k) 1 - a < / sup>每步位数。该速率的上限为(log n) 1 - a ,因此明显的算法是渐近最优的。
答案 1 :(得分:2)
我不知道确切的答案,但这里有一些结果暗示答案可能是天真的答案:
假设我们将输入分为4个部分(4个可以用k代替);
对4个部分中的每个进行排序需要n / 4 *(log(n / 4)^ a),结合需要的结果(n / 2 + n / 2 + n)= 2n;
n / 4 *(log(n / 4)^ a)* 4 = n(logn ^ a)-n / 4 *(log4)^ a,
总时间= n(logn ^ a) - n / 4 *(log4)^ a + 2n
但是,如果a = 1,则rhs = n(log(n)^ a);如果a&lt; 1,rhs> N(LOG(n)的一个^)。
因此,即使从现实世界的角度考虑,而不是从Big-Oh的角度考虑,划分和征服方法只能在&lt; 1时减慢速度,并且当a = 1时没有任何好处。
然而,我不知道是否还有其他技巧。希望这至少可以引发一些想法!