计算递归算法的时间复杂度

时间:2019-03-10 12:34:12

标签: time-complexity

我正在尝试获取此算法的时间复杂度,但不确定如何实现。会很高兴为您提供帮助。

`int g(int arr[], int start, int end, int k)
{
if (start > end) return 0;
int mid = (start + end) / 2;
if (arr[mid] < k) return 1 + g(arr, mid + 2, end, k);
if (arr[mid] > k) return 1 + g(arr, start, mid - 1, k);
return g(arr, start, mid - 1, k) + 1 +
g(arr, mid + 1, end, k);
}`

答案是O(n)。

1 个答案:

答案 0 :(得分:1)

这是使用二进制搜索机制的递归。 每次我们检查arr[mid]是否等于值k时;如果小于k,则搜索数组的右半部分(mid+2应该为mid+1);如果大于,则搜索数组的左半部分;如果它等于k,然后搜索数组的两半。 因此,每次调用递归函数时,我们仅使用一半的输入(一半的数组)。 因此,我们可以这样写:

  

T(n)= 2 * T(n / 2)+1

     

T(n)= 2 * 2 * T(n /(2 * 2))+ 1 + 1

     
    

...继续扩展

  
     

T(n)= 2 ^ k * T(n /(2 ^ k))+ k

     

n /(2 ^ k)= 2 ==> k = log(n)

     

T(n)= 2 ^(log(n))* 1 + log(n)= O(n)使用日志规则知道2 ^ log(n)= n。

即使您没有要求,但空间复杂度为O(log(n)),因为递归树的最大深度为log(n)。