计算复杂度时:[0] + a [1]会导致两次数组访问,还是只有一次?

时间:2017-05-01 12:23:48

标签: java time-complexity complexity-theory

说a是一个整数数组。 1)给出代码:

for(int i = 0; i < N; i++){
   if(a[0] + a[1] == 0){
      ...
   }
}

这是时间复杂度~2n还是更确切地说~1n 注意:我使用的是波浪符号,而不是大符号。常数确实很重要。

2)这段代码怎么样:

for(int i = 0; i < N; i++){
   if(a[0] == 0 && a[1] == 0){
      ...
   }
}

这是时间复杂度~2n还是更确切地说是〜1n

非常感谢!

1 个答案:

答案 0 :(得分:2)

在第一个示例中, 是两个数组访问。访问a[0]不会告诉我们a[1]。我们需要进行两次访问才能执行+操作。正如字节码*显示我们:

      10: aload_0
      11: iconst_0
      12: iaload
      13: aload_0
      14: iconst_1
      15: iaload
      16: iadd

aload_0将对象推送到堆栈中的变量0(a,在我的情况下),然后当然iconst_0在堆栈上推送0,我们看到从iaload获取数组中的int。然后我们看到整个事情重复了索引1,然后是加法。

在第二个示例中,如果a[0]0,则&&短路和a[1]从未加载或测试,因此所需时间将因需要a[1]的频率。

*我如何获得该字节码:我创建了一个E.java文件:

class E {

    public static void main(String[] args) {
        foo(new int[] { 1, 2, 3, 4, 5, 6 });
    }

    static void foo(int[] a) {
        int N = a.length;
        for(int i = 0; i < N; i++){
           if(a[0] + a[1] == 0){
              System.out.println("Foo");
           }
        }
    }
}

然后编译它,并使用javap -c E来查看字节码。