我遇到了这种方法的计算复杂性问题。我认为在每次通话时,操作次数都会增加一倍,这就是为什么我说它为O(2 ^ n),但回答说它是O(n)。你能解释一下它是怎么回事吗?
int binarySum(int[] d, int low, int high){
if(low > high)
return 0;
else if( low == high)
return d[low];
else{
int mid = ( low + high ) / 2;
return binarySum(d, low, mid) + binarySum(d, mid+1, high);
}
答案 0 :(得分:0)
是的,操作次数在每一步都加倍,但在添加整个阵列之前也只有log n步骤。例如,如果数组中有16个元素,则只需要4个“步”即可遍历数组中的每个元素。因此,操作次数为2 ^ 4或16。
因此,复杂度实际上不是2 ^ n,而是2 ^ log n,它恰好等于O(n)。