使用递归关系分析时间复杂度

时间:2015-05-27 00:08:46

标签: algorithm recursion time-complexity complexity-theory recurrence

复杂性分析noob在这里。

我试图使用下面给定的递归关系来计算递归算法的时间复杂度 -

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

我知道有三种方法,但我试图通过总结树的每个级别完成的工作量来解决。

当我绘制递归树时,我得到像这样的结构

                        n                          | n work
                     /     \
              4T(n/2)        4T(n/2)               | 2n work
             /     \         /        \
         4T(n/2)   4T(n/2)   4T(n/2)  4T(n/2)      | 4n work

          .          .          .       .
          .          .          .       .
     Theta(1) Theta(1) Theta(1).......Theta(1)     | ???

我坚持计算总和 (n + 2n + 4n + 8n ......) 因为

  • 我无法弄清楚最后一个词。
  • 即使我这样做,我也意识到这是一个比率为r> 1的几何系列,所以我无法真正计算总和。

有人可以帮我理解如何解决这个问题吗?

修改 注意:我从这里找到了问题 - http://fileadmin.cs.lth.se/cs/Personal/Rolf_Karlsson/lect1.pdf哪里有解决方案,但我并不完全遵循它,看起来我的表达至少是正确的,但我无法遵循最后一个学期得到了。

2 个答案:

答案 0 :(得分:1)

元素a,ar,ar ^ 2,...,ar ^ n-1的几何级数求和公式由

给出
S(n) = a((r^n)-1)/(r-1)  // in case of r>1

深度为i的节点的子问题大小为n /(2 ^ i)。因此,当 n/(2^i) = 1 时,子问题的大小为1,或等效地,当i = log 2 n时。

每个级别的节点数比上面的级别多4倍,因此深度为i的节点数为4 ^ i。

因为每个级别的子问题大小减少了2倍,我们从根向下,每个节点在深度i,对于i = 0,1,2,...,log 2 n-1,成本为c * n /(2 ^ i)。相乘,我们看到深度为i的所有节点的总成本,对于i = 0,1,...,log 2 n-1 4^i * c * n/(2^i) = (2^i)*c*n

深度log 2 n的最后一级有4 ^(log 2 n)= n ^(log 2 4)=( n ^ 2)元素,每个元素贡献成本T(1),即θ(n ^ 2)。

将所有级别的费用加起来,

  

T(n)= cn + 2cn + 4cn + ... + cn *(2 ^ log 2 n-1)+θ(n ^ 2)

 = cn*[(2^log<sub>2</sub>n)-1]/(2-1) + θ(n^2)

 = cn*[(n^log<sub>2</sub>2)-1] + θ(n^2)

 = cn*(n-1)+ θ(n^2)

 = cn^2 - cn + θ(n^2)

 = θ(n^2).    // OR    O(n^2) for an upper bound.

因此,递归树的复杂性为θ(n ^ 2)。你可以很好地说它的复杂性是O(n ^ 2)。

答案 1 :(得分:0)

从根到叶子,树的每个级别都会看到def convert_from_dotted_keys(hash) new_hash = {} hash.each do |key, value| h = new_hash parts = key.to_s.split('.') while parts.length > 0 new_key = parts[0] rest = parts[1..-1] if not h.instance_of? Hash raise ArgumentError, "Trying to set key #{new_key} to value #{value} on a non hash #{h}\n" end if rest.length == 0 if h[new_key].instance_of? Hash raise ArgumentError, "Replacing a hash with a scalar. key #{new_key}, value #{value}, current value #{h[new_key]}\n" end h.store(new_key, value) break end if h[new_key].nil? h[new_key] = {} end h = h[new_key] parts = rest end end new_hash end 个半部,因此树的级别为n

总和将是:

log2(n)

上述所有分析均假设n是2的幂,但与大多数情况一样,假设不重要。