这个递归式是一个经典的问题,也叫做“二分查找算法的复杂度”。
递归式的意思是将一个规模为n的问题分解成两个规模为n/2的子问题,每次递归调用会增加1。这可用二叉树表示,树的高度为log n,而每个节点的代价为1。那么总代价为n 的指数级,是不可接受的。
所以需要使用Master定理来解决这个问题,该定理提供了一个计算递归式复杂度的通用方法。
假设递归式 T(n)=a T(n/b)+f(n) 其中 a≥1,b>1 是常数,f(n) 是渐进正函数。
Master定理的情形1,如果 f(n) = O(n^logb a-ε) for some constant ε>0,那么复杂度为T(n) = Θ(nlogb a)。
应用到这个问题,a=1,b=2,所以logb a=0。f(n) = 1,它不是 O(n^logb a) 中的任何一个,所以Master定理不适用。
但是,由于f(n) 是常数,可以用递归树的方法来计算该递归式的解。n个节点的递归树的高度为log n,所以时间复杂度为O(log n)。
代码示例:
int T(int n)
{
int count=0;
while (n > 1)
{
count++;
n = (n+1)/2;
}
return count+1;
}