划分和征服 - 为什么它有效?

时间:2013-03-27 15:27:53

标签: algorithm complexity-theory big-o divide-and-conquer

我知道像mergesort和quicksort这样的算法使用了分而治之的范式,但我想知道为什么它可以降低时间复杂度......

为什么通常“分而治之”的算法比非分而治之的算法效果更好?

3 个答案:

答案 0 :(得分:3)

划分和征服算法的工作速度更快,因为它们最终会减少工作量。

考虑二元搜索的经典分而治之算:不是查看N个项目来找到答案,二元搜索最终只会检查它们的Log2N。当然,当你减少工作时,你可以更快完成;这正是分而治之的算法正在发生的事情。

当然,结果很大程度上取决于你的策略在划分工作方面的表现如何:如果每个步骤的分工或多或少都是公平的(即你将工作分成两半),你就会得到完美的Log2N速度。但是,如果除法不完美(例如,快速排序的最坏情况,当它花费O(n^2)对数组进行排序,因为它在每次迭代时只消除了一个元素),那么分而治之的策略没有用,因为你的算法不会减少工作量。

答案 1 :(得分:2)

划分和征服算法“通常不会更好”。它们只是起作用,就像其他非分治算法一样。它们不会降低排序复杂性,它们与其他算法一样好。

答案 2 :(得分:1)

划分和征服作品,因为数学支持它!

考虑一些分而治之的算法:

1)二进制搜索:此算法每次将输入空间减少一半。很明显,这比线性搜索更好,因为我们会避免查看很多元素。

但是,还好多少?我们得到了复发(注意:这是最坏情况分析的复发):

T(n) = T(n/2) + O(1)

数学意味着T(n) = Theta(log n)。因此,这比线性搜索指数级好。

2)合并排序:这里我们分成两个(几乎)相等的一半,对两半进行排序然后合并它们。为什么这要优于二次方?这是重复:

T(n) = 2T(n/2) + O(n)

可以在数学上显示(比如使用Master定理)T(n) = Theta(n log n)。因此,T(n)渐近地优于二次方。

观察天真的快速排序最终会让我们重复最坏情况

T(n) = T(n-1) + O(n)

在数学上,它是二次的,在最坏的情况下,并不比冒泡排序(渐近地说)更好。但是,我们可以证明,在一般情况下,快速排序是O(n log n)。

3选择算法:这是一个征服算法,用于找到第k个最大的元素。这种算法是否优于排序(或者甚至不是二次方法)并不是很明显。

但从数学角度来看,它的复发(最糟糕的情况)似乎是

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

可以在数学上显示T(n) = O(n),因此它比排序更好。

也许是一种常见的方式来看待它们:

您可以将算法视为树,其中每个子问题都成为当前的子树,并且可以使用完成的工作量标记节点,然后可以为每个节点添加总工作量。

对于二进制搜索,工作是O(1)(只是比较),其中一个子树,工作是0,所以工作总量是O(log n)(本质上是一个路径,就像我们在二叉搜索树中一样。)

对于merge-sort,对于具有k个子节点的节点,工作是O(k)(合并步骤)。在每个级别完成的工作是O(n)(n,n / 2 + n / 2,n / 4 + n / 4 + n / 4 + n / 4等)并且有O(log n)级别,并且所以merge sort是O(n log n)。

对于quicksort,在最坏的情况下,二叉树实际上是一个链表,所以完成的工作是n + n-1 + ... + 1 = Omega(n ^ 2)。

对于选择排序,我不知道如何将其可视化,但我相信它看起来像一棵有3个孩子的树(n / 5,7n / 10和其余的)可能仍然有帮助。