我正在尝试获取此算法的时间复杂度,但不确定如何实现。会很高兴为您提供帮助。
`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)。
答案 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)。