2014-10-12 97 views
0

该代码打印数组“pts”(每次4个元素)中存在的元素的组合,使得数字的特定组合不会多次出现。例如。如果已经打印1 2 3 4,则不应打印其排列。如何降低这部分代码的复杂度?

for (int i = 0; i < pts.length; i++) { 
    for (int j = i+1; j < pts.length; j++) { 
     for (int k = j+1; k < pts.length; k++) {  
      for (int l = k+1; l < pts.length; l++) { 
       System.out.println(""+pts[i]+" "+pts[j]+" "+pts[k]+" "+pts[l]); 
      } 
     } 
    } 
} 

如果任何人都可以提出一些其他的办法,也可以告诉我如何减少这种代码的复杂性。我会很感激

+2

不,这是你能做的最好的。除了可读性以外,没有可能的改进。不要添加那些可怕的“// k”注释 - 它们只会混淆代码而不添加信息。 – duffymo 2014-10-12 12:26:52

+2

一个println命令在结果中被执行。如果不忽略结果,它怎么可能小于这个呢? – 2014-10-12 12:28:56

+0

你实际上从来没有使用存储在''pts''数组中的任何值。这是打算? – gdiazc 2014-10-12 12:30:29

回答

2

没有太多可以改善这一点。输出是O(n^4)。复杂性在于问题陈述中,而不是在执行这个循环。你应该看看为什么你想枚举所有集合(i,j,k,l)与我< j < k < l。

您可以避免在每个循环中引用pts.length。取决于你在循环中做什么,对编译器来说不明显,pts长度不会改变。以下代码只有1个对pts.length的引用,并仍然返回所有集合,其中i为< j < k < l < pts.length。

for (int l = 0; l < pts.length; l++) { 
    for (int k = 0; k < l; k++) {  
     for (int j = 0; j < k; j++) { 
      for (int i = 0; i < j; i++) { 
       System.out.println(""+i+" "+j+" "+k+" "+l); 
      } 
     } 
    } 
} 

请注意,它改变了生成集的顺序,我不知道它是否重要。无论如何,这是一个真正的小改进。