Java 查找以下代码的时间复杂度和大O

Java 查找以下代码的时间复杂度和大O,java,algorithm,time,time-complexity,analysis,Java,Algorithm,Time,Time Complexity,Analysis,找出以下代码的时间复杂度和大O。 我对if-else语句和其他bara和fooa函数的时间复杂性感到困惑。一些朋友说它的时间复杂性为^2,一些朋友说它的时间复杂性将为^2。我还认为下面代码的时间复杂度将开启,因为for循环中有一个return语句,它将使foo和bar函数的时间都成为O1,而main for循环将运行n次,因此时间复杂度将开启 //示例代码 public static void main(String args[]){ Scanner in = new Scanner(S

找出以下代码的时间复杂度和大O。 我对if-else语句和其他bara和fooa函数的时间复杂性感到困惑。一些朋友说它的时间复杂性为^2,一些朋友说它的时间复杂性将为^2。我还认为下面代码的时间复杂度将开启,因为for循环中有一个return语句,它将使foo和bar函数的时间都成为O1,而main for循环将运行n次,因此时间复杂度将开启

//示例代码

public static void main(String args[]){
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int sum = 0;
    for(int i=0 ; i<n ; ++i){
        if(i%2 != 0){
            sum += foo(i , n) + foo(1+i , n);
        }
        else{
            sum += foo(i , n) + bar(i , n);
        }
    }    
}
-

-


由于您使用迭代范式表达了算法,所以您所要做的就是计算操作的数量

bar的复杂度是^2,因为您有n*n+1/2个类型为add i,j,然后乘以a的操作

foo的复杂性在于n个类型的操作乘以a

在主循环中,操作的一半将调用foo两次,这将生成n/2*n个操作,这些操作位于^2上。 迭代的后半部分将调用foo-then-bar,这将产生n/2*[n+n*n+1/2],也就是说0.25.n^3+0.75.n^2,在^3上

因此,循环的总体复杂性为^3。这通常被称为算法的时间复杂性,即使我们计算了操作的数量-它背后的直觉是考虑一组操作单元,并且确认每个操作单元将花费一定的时间。在我们的例子中,我们选择了算术运算+和*

我们还可以从内存消耗的角度分析您的算法。在您的例子中,无论n的值是多少,所消耗的内存都是恒定的。这就是为什么我们会说,相对于n,空间复杂度是O1

编辑:我认为《富与巴》中过早的回归是一个打字错误。如果不循环,那么foo和bar的复杂度是O1,主循环是开的。

foo->On,因为它从i=0->n开始:

栏->在^2上,因为它来自j=1+2+3+…+n位于^2上,如下所示:

对于main,你从i=0->n开始,每i的偶数值调用foon两次。你也打电话给foon,但这不是最坏的情况,所以我们不在乎

考虑到最坏情况下的谷仓,每隔0到n的形式调用n/2次:


可能的重复检查这个资源,然后详细说明你被困在哪里听起来像是家庭作业。到目前为止你试过什么?分享你的想法。你被卡住了吗?我投票结束这个问题,因为不清楚用户的问题到底是什么。它也显示出没有努力解决问题本身。对,复杂性是因为回报。但是超级复制优化器可能会看到foo和bar总是返回0,所以执行任何操作都没有用!在for循环中,foo和bar函数中都有一个return语句。所以我认为时间复杂性应该是O1Ah对的——我认为这只是一个错误。如果不循环,那么foo和bar的复杂度是O1,主循环是开启的。
static void bar(int a , int n){
for(int i=0 ; i<n ; ++i){
    for(int j=0 ; j< i ; ++j){
        return a*(i+j);
    }
  }
}
static void foo(int a , int n){
for(int i=0 ; i<n ; ++i){
        return a*i;
   }
}