如何计算像这样复杂的递归算法的复杂性 在这种情况下,什么是复杂的东西(0,n)
void something(int b, int e) {
if (b >= e) return;
int a = 0;
for(int i=b; i < e; i++)
a++;
int k = (b+e)/2;
something(b, k);
something(k+1, e);
}
我试图分析这个算法并认为它的复杂性是n * ln(n),但仍然无法获得正式的证明。
答案 0 :(得分:1)
最初,循环将运行(e-b)
次,它将自己称为 2次,但将循环的大小减少一半
因此,((e-b)/2)
将运行2次迭代;一次由(b,(b+e)/2)
再次由((b+e)/2+1,e)
同样,两次迭代将再次调用自己2次,但将迭代长度减少一半。
所以`((e-b)/ 4)将运行4次,依此类推。
递归树的高度为log(b-e)
,(每个节点有2个孩子)
所以,time complexity = (b-e) + 2*((b-e)/2) + 4*((b-e)/4) + .....(log(b-e) times)
此表达式的计算结果为(b-e)*log(b-e)
因此,时间复杂度= O(nlogn)