2014-10-12 93 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); 
      } 
     } 
    } 
} 

請注意,它改變了生成集的順序,我不知道它是否重要。無論如何,這是一個真正的小改進。