我被一个问题困住了,我只需要一个大方向的提示/点(不要求答案)
该问题询问分治算法的详细信息,该算法给定几乎已排序的序列,在时间 O(n) 内产生正确的顺序。
他们所说的几乎排序的意思是给定列表
x_1, x_2, .... x_n
如果排序列表由
y_1, y_2, ... y_n
并且对于每一个 i, j <= n 这个属性都受到尊重:
x_i == y_j && |ij| <= 根(n)
我想到的唯一一件事是将列表划分为每个级别的 root(n) 组(这将导致它们在第一次拆分时最多为 root(n)),但我不太确定在哪里从那里开始,因为您必须在递归备份时一次加入 root(n) 元素。
我还发现递归复杂度方程是:
T(n) = root(n) * T(n/root(n)) + d * root(n)
可以master's theorem
证明是 O(n) 时间。
所以看起来我在拆分方面走在正确的轨道上,我只是不确定是否应该以特殊方式拆分或比较某种方式或什么。
编辑:所以据说这是正确的答案。
我们的算法如下:如果 n > 1,那么我们递归地对序列的两个(近似)半部分中的每一个进行排序;现在所有元素都在正确的位置,除了中间的√n个位置(你明白为什么这是真的吗?);所以我们现在对这些位置的元素进行合并。如果我们让 T(n) 是用于对 n 个元素进行排序的时间,那么对于 n > 1,我们有
T(n)≤2T(⌈n=2⌉) +c * √n
由于 √(n) = n .5和 .5 < 1 = log 2 2,分治循环的主定理告诉我们 T(n)∈O(n)。
我不确定我是否同意,因为对两半进行排序的时间是 O( n ⁄ 2 * log( n ⁄ 2 )),结果是 O(n*logn),最终合并是 O(√ n * √n) 这是 O(n) 给我们总共 O(n*logn + n) -> O(n*logn)