复杂性分析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 ......) 因为
有人可以帮我理解如何解决这个问题吗?
修改 注意:我从这里找到了问题 - http://fileadmin.cs.lth.se/cs/Personal/Rolf_Karlsson/lect1.pdf哪里有解决方案,但我并不完全遵循它,看起来我的表达至少是正确的,但我无法遵循最后一个学期得到了。
答案 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的幂,但与大多数情况一样,假设不重要。