繁体   English   中英

查找该算法的时间复杂度

[英]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 == 0index < 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM