看看这种递归关系的算法复杂度:
?
此递归关系表示哪种算法。注意,这里有一个T(n) = 2 T(n-1) - 1
而不是minus
,所以它不能成为分而治之的算法。
哪种类型的算法因其递归关系而具有复杂性?
答案 0 :(得分:1)
基于给定的时间复杂度,它是一种指数算法。
要使尺寸减小1,您需要将时间乘以2(大约)
因此它不属于任何多项式时间算法范式,例如分而治之,动态编程,...
答案 1 :(得分:1)
T(n) = 2 T(n-1)-1
T(n) = 4 T(n-2)-3
T(n) = 8 T(n-3)-7
T(n) = 16 T(n-4)-15
...
T(n) = 2^k T(n-k) - 2^(k-1)
例如,如果T(1) = O(1)
,则
T(n) = 2^(n-1) O(1) - 2^(n-2) = O(2^(n-1)) = O(2^n)
这是指数增长。
现在让我们看一下O(1) - 1 = O(1)
。来自CLRS:
O(g(n))
= {f(n)
:存在正常数c
和n0
,使得0 <= f(n) <= c g(n)
对所有n >= n0
}
因此,要消除-1
的影响,我们只需要将隐藏常量c
增加一个即可。
因此,只要您的基本案例具有O(1)
,O(n)
和n > 0
这样的复杂性,您就不必在意-1
。换句话说,如果您使T(n) = 2 T(n-1)
中的n
重复出现至少成指数规律,那么您就不必关心此-1
。
示例:假设您被告知是否包含S
个字符的字符串n
包含指定的字符。然后像这样继续,您在S[0..n-2]
和S[1..n-1]
上递归运行算法。当字符串为一个字符长度时,您可以停止递归,然后只需检查字符即可。