我遇到了这种复发关系的问题。
T(n)= 2T(n / 2)+ 1
任何人都可以帮我解释如何解决这个问题以获得O(n)
的答案吗?
答案 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 = 1
和q = 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 = 2
,b = 2
和f(n) = 1
。所以c = log2(2) = 1
和O(n^1) > O(1)
,这意味着我们属于第三种情况,因此复杂性为O(n)
。