[英]Finding Time Complexity Of This Algorithm
我试图找到这个算法的时间复杂度,我尝试使用T(n)
计算它,假设T(n) = 2T(n-1) + Const
并得到O(n)
结果。
bool sum(int arr[], int x, int n, int index){
if(x == 0 && index == 3)
return true;
if(n == 0)
return false;
if (index == 3)
return false;
if(sum(arr+1, x-arr[0], n-1, index + 1))
return true;
return sum(arr+1, x, n-1, index);
}
顶部调用以 index = 0 开始。基本上我想看看是否有一个三元组总和为给定值 x。
我错过了什么吗?
首先, T(n) = 2T(n-1) + Const
会使 T(n) 为 O(2^n),而不是 O(n)。 如果您没有index == 3
停止条件,这将是运行时。 但是这种停止条件会显着降低运行时间。
找到时间复杂度的一种方法是计算递归树中叶子的数量(即达到停止条件的次数)。 每个index == 3
叶子对应于 n 个元素中的 3 个选择,因此有 C(n, 3) 个这样的节点。 n == 0
且index < 3
叶子对应于 0、1 或 2 个元素的选择,即 C(n, 0) + C(n, 1) + C(n, 2)。 因此叶子的总数是 O(n^3)。
由于内部节点(未达到停止条件并因此进行递归调用的调用)的数量大约等于叶子的数量,并且每次调用都执行 O(1) 工作,不包括递归调用,因此总运行时间为 O (n^3)。
获得相同结果的另一种方法是考虑T(n, index)
:
T(n, 3) = C = O(1)
T(n, 2) = T(n-1, 3) + T(n-1, 2) + C = O(n)
T(n, 1) = T(n-1, 2) + T(n-1, 1) + C = O(n^2)
T(n, 0) = T(n-1, 1) + T(n-1, 0) + C = O(n^3)
鉴于假设顶级调用是使用index == 0
(来自评论)进行的,算法是 O(n 3 )。 忽略实现的细节,更抽象地考虑它在做什么:
arr
执行线性扫描,其中
e
,它在e
之后开始对arr
的尾部执行线性扫描,其中
f
,它在f
之后开始对arr
的尾部执行线性扫描,其中
g
,它检查是否e + f + g == x
边界情况是没有三元组元素和x
,在这种情况下,直到所有扫描完成,过程才会结束。 从该描述中可以清楚地看出,递归等效于三重嵌套循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.