如何解决这种递归关系:T(n)= 2T(n / 2)+ 1

时间:2013-08-18 01:26:54

标签: algorithm recurrence

我遇到了这种复发关系的问题。

  

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

任何人都可以帮我解释如何解决这个问题以获得O(n)的答案吗?

3 个答案:

答案 0 :(得分:3)

为简单起见,我们假设n是2的幂。例如,如果n = 8和基本情况T(0) = 0那么递归调用树看起来像这样:

                       1                                n = 8, depth 0
                      / \
                     /   \
                    /     \
                   /       \
                  /         \
                 /           \
                /             \
               /               \
              /                 \
             /                   \
            /                     \
           1                       1                    n = 4, depth 1
          / \                     / \
         /   \                   /   \
        /     \                 /     \
       /       \               /       \
      /         \             /         \
     1           1           1           1              n = 2, depth 2
    / \         / \         / \         / \
   /   \       /   \       /   \       /   \
  1     1     1     1     1     1     1     1           n = 1, depth 3
 / \   / \   / \   / \   / \   / \   / \   / \
0   0 0   0 0   0 0   0 0   0 0   0 0   0 0   0         n = 0, depth 4

树的log(n) + 1级别不计入最低级别,因为此级别中的每个节点的成本都为0。为了计算T(n),在这种情况下T(8),您必须总结树中的所有内容。

请注意,在i深度上,有2^i个节点,每个节点的成本等于1

因此,树中的总和的公式为:

sum [from i = 0 to log(n)] 2^i

这是一个包含a_1 = 1q = 2的几何图形序列,您想知道第一个log(n) + 1值的总和。这由公式给出:

(1 - 2^(log(n) + 1)) / (1 - 2) = 2n - 1

因此对于n = 8,结果为15

我希望这会对你有所帮助。

答案 1 :(得分:2)

这种关系的一个很好的解释在Cormen等人的“算法导论”中给出。该书中的主定理4.1处理形式为T(n)= aT(n / b)+ f(n)的所有重复关系。对于f,a和b的各种组合。该定理中的一个案例,案例2.可以应用于您的示例,给出O(n)估计。所以,为了回答你的问题,你不能只是解决这样的关系,在执行一些常规计算的意义上最终得到渐近,而你观察到你的情况属于一类关系,估计存在。

答案 2 :(得分:0)

使用Master theorem解决这种类型的递归。

根据您的情况a = 2b = 2f(n) = 1。所以c = log2(2) = 1O(n^1) > O(1),这意味着我们属于第三种情况,因此复杂性为O(n)