Java (n^2)的大O表示法

Java (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

例1

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