如何解决查找该算法的时间复杂度
我试图找到这个算法的时间复杂度,我尝试使用 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,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(n3)。忽略实现的细节,更抽象地考虑它在做什么:
- 它对数组
arr
执行线性扫描,其中- 对于每个元素
e
,它在arr
之后开始对e
的尾部执行线性扫描,其中- 对于每个元素
f
,它在arr
之后开始对f
的尾部执行线性扫描,其中- 对于每个元素
g
,它检查是否e + f + g == x
- 对于每个元素
- 对于每个元素
- 对于每个元素
边界情况是没有三元组元素和为 x
的情况,在这种情况下,直到所有扫描完成,过程才会结束。从该描述中可以清楚地看出,递归等效于三重嵌套循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。