Java (n^2)的大O表示法
例1Java (n^2)的大O表示法,java,big-o,time-complexity,Java,Big O,Time Complexity,例1 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.println(count++); } } for(int i=0;i
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println(count++);
}
}
for(int i=0;i
例2
for (int i = 0; i < n * n; i++) {
System.out.println(count++);
}
(inti=0;i
System.out.println(count++);
}
两个例子都给了我一个大O(n^2)。但是哪个ans是最好的?两个循环都是相同的。没有最好的。但如果
N
值较大,则N*N
值将溢出,您需要返回到两个for循环。因此,您可以根据您的N
值来使用它。要找到最好的代码,最好编译它并使用javap-c ClassName.class
查看这两种方法生成的字节码。我对前者使用foo
方法,对后者使用bar
方法
public static void foo(int n) {
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.println(count++);
}
}
}
public static void bar(int n) {
int count = 0;
for (int i = 0; i < n * n; i++) {
System.out.println(count++);
}
}
最后,由于操作较少,后一种实现似乎比前一种更好
我不是这方面的专家,所以如果有人可以编辑/执行更好的分析,请随意操作。我之所以写这个答案,是因为它不适合一条注释。当你说最好的时候,从编程的角度来说,有两种方法可以定义内存和性能(通常是迭代) 就内存而言,第二个最好,因为只使用了两个变量(i和n)。 除此之外,每次迭代只会发生一次变量赋值(i++=>i=i+1)。 而在第一个i++和j++中,每次迭代都会发生两个赋值操作。 由于在高处理操作中重新分配变量也需要相当长的时间,所以第二种方法最好
就迭代而言,两者都是相同的。我不明白你说的最好是什么意思?我认为第二个是最好的,当你分配
n=n*n
,然后为(int I=0;I时会更好。
!第二个是最好的选择,就像你不需要进一步循环,如果你知道预期的行为最好的目的是什么?“晴朗的天空是蓝色的,蓝色的油漆是蓝色的,但哪一个是最好的?”同样有道理。你在问什么?最好的方法是什么?假设count
从0开始,那么如果N*N
将溢出,count
也将溢出。所做的操作越少越好。!
public static void foo(int);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: iload_0
6: if_icmpge 38
9: iconst_0
10: istore_3
11: iload_3
12: iload_0
13: if_icmpge 32
16: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_1
20: iinc 1, 1
23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
26: iinc 3, 1
29: goto 11
32: iinc 2, 1
35: goto 4
38: return
public static void bar(int);
Code:
0: iconst_0
1: istore_1
2: iconst_0
3: istore_2
4: iload_2
5: iload_0
6: iload_0
7: imul
8: if_icmpge 27
11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
14: iload_1
15: iinc 1, 1
18: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
21: iinc 2, 1
24: goto 4
27: return