微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查找该算法的时间复杂度

如何解决查找该算法的时间复杂度

我试图找到这个算法的时间复杂度,我尝试使用 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 == 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(n3)。忽略实现的细节,更抽象地考虑它在做什么:

  • 它对数组 arr 执行线性扫描,其中
    • 对于每个元素e,它在arr之后开始对e的尾部执行线性扫描,其中
      • 对于每个元素f,它在arr之后开始对f的尾部执行线性扫描,其中
        • 对于每个元素g,它检查是否e + f + g == x

边界情况是没有三元组元素和为 x 的情况,在这种情况下,直到所有扫描完成,过程才会结束。从该描述中可以清楚地看出,递归等效于三重嵌套循环。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?