划分和征服算法的时间复杂性

时间:2011-12-21 08:37:43

标签: c algorithm divide-and-conquer

请您帮助我理解分而治之算法的时间复杂性。

让我们举一个例子。 http://www.geeksforgeeks.org/archives/4583方法2: 它给出T(n)= 3 / 2n -2,我不明白为什么?

对不起,如果我给你一个额外的页面打开,但我真的想了解至少一个很好的高级别,以便我可以自己找到这些算法的复杂性,你的答案非常感谢。

2 个答案:

答案 0 :(得分:2)

由于某种原因无法打开此链接。我还是试一试。 当你使用分而治之的策略时,你所做的就是将问题分解成许多小问题,然后结合小问题的解决方案来获得主要问题的解决方案。 如何解决较小的问题:进一步分解它们。分解过程一直持续到达到问题小到可以直接处理的水平。

如何计算时间复杂度: 假设算法所用的时间是T(n)。请注意,所花费的时间是问题大小的函数,即n。

现在,请注意你在做什么。你把这些问题分解成我们说的每个大小为n / k的k个部分(它们的大小可能不相等,在这种情况下你必须单独添加它们所花费的时间)。现在,你将解决这些k部分。每个部分所花费的时间将是T(n / k),因为现在问题大小减小到n / k。你正在解决这些问题。因此,它需要k * T(n / k)时间。

解决这些较小的问题后,您将结合他们的解决方案。这也需要一些时间。那个时间将再次成为你问题规模的函数。 (它也可以是不变的)。那个时间是O(f(n))。

因此,您的算法所花费的总时间将是: T(n)=(k * T(n / k))+ O(f(n))

你现在有了一个递归关系,你可以解决它来得到T(n)。

答案 1 :(得分:2)

如此链接所示:

  T(n) = T(floor(n/2)) + T(ceil(n/2)) + 2
  T(2) = 1
  T(1) = 0

对于T(2),它是返回前进行​​单一比较的基础。对于T(1),它是一个没有任何比较的基础。
对于T(n):你递归地调用方法两半的数组,并比较两个(最小,最大)元组,找到真正的最小值和最大值,它给你上面的{{1}方程式

T(n)

这很好地解释了自己。

If n is a power of 2, then we can write T(n) as:

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

在这里,你用感应来解决它:
基本情况:对于n = 2: T(n) = 3/2n -2
我们假设每个T(2) = 1 = (3/2)*2 -2 T(k) = (3/2)k - 2
k < n
(*)归纳假设,因为T(n) = 2T(n/2) + 2 = (*) 2*((3/2*(n/2)) -2) + 2 = 3*(n/2) -4 + 2 = (3/2)*n -2

是真的

因为我们证明了归纳法是正确的,所以我们可以得出结论:n/2 < n