说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
非常感谢!
答案 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
来查看字节码。