2012-07-12 49 views
2

是否有一種有效的方法來運行嵌套for循環,避免任何具有相同值的計數器。顯然,我可以運行一些if語句,如下所示,但有沒有更有效的方法?運行嵌套循環而不重複變量?

for i = 1 to 20: 
    for j = 1 to 20: 
     if (i == j): 
      continue 
     else:    
      for k = 1 to 20: 
       if (i == k) or (j == k): 
        continue 
       else: 
        do something useful with these different numbers 

編輯:變量是不能互換的,所以[2,1,0]是不同的[0,1,2]。 「做一些有用的事情」將對數字進行大約6次數值檢查,包括對它們進行加法,平方和平方根。

謝謝,並對可能不尋常的僞代碼(和不斷編輯)抱歉。

+0

你可以通過分別反轉if('i!= j'和'(i!-k)和(j!= k)')的邏輯來擺脫else部分),但這不是真正的效率,而是可讀性。 – fvu 2012-07-12 17:06:42

+0

您的循環嵌套可能會影響性能(由於對分支預測和內存局部性的影響),但這取決於「對這些不同的數字執行一些有用的操作」中的內容。 – Brian 2012-07-12 17:26:02

回答

1

這看起來像是你能做到的最有效的方法。你有什麼問題?

我只是忽略了我無法想出任何理由需要這樣做的部分....所以如果您有特定情況請分享?除非你試圖將一個項目與列表中的所有其他項目進行比較,而不是我自己呢?

它可以做的

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8 
for(int i = 0; i < list.size()-1; i++){ 
    for(int j = i + 1; j < list.size(); j++){ 
     System.out.println(list[i] + "," + list[j]); 
    } 
} 

你不要重複你已經比較事物之間比較的方式。

三年巢

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8 
for(int i = 0; i < list.size()-2; i++){ 
    for(int j = i + 1; j < list.size()-1; j++){ 
     for(int k = j + 1; j < list.size(); k++){ 
      System.out.println(list[i] + "," + list[j] + "," + list[k]); 
    } 
} 
+0

這是一個數學問題,三個變量中的任何一個都不允許是相同的,我很勉強強制它,所以我試圖儘可能地使所有的東西變得高效。 – SiliconCelery 2012-07-12 17:09:51

+0

分享此問題?我有一種感覺,有一種更好的方式來蠻力... – 2012-07-12 17:12:11

+0

還有其他優化我會用,但我認爲把它們放在原來的問題會混淆事項,我不希望任何幫助。問題是:http://unsolvedproblems.org/index_files/MagicSquare.htm,我知道我不會遇到像這樣一個未解決的問題,它更有趣。 – SiliconCelery 2012-07-12 17:15:42

0

你所能節省的效率在這裏是你的循環邏輯的唯一的事情。假設你正確地實現它,總會有20 * 19 * 18的操作。

您將無法找到您提供的有限細節的解決方案。什麼是'有用的東西'?

如果事實證明,對於該操作,i,j和k的個別值並不重要,只是3個數字的組合,那麼您可以節省大量的效率。在你目前的設置下,你將通過(i,j,k)值(1,2,3)(1,3,2)(2,1,3)(2,3,1)等等。

所以如果你正在尋找組合,而不是排列,你可以修改它,以減少6的事實相當容易,通過開始j比我大,在每個內部循環比j大一個。

+0

我已經編輯了這個問題,包括這個,我最初應該做的。謝謝。 – SiliconCelery 2012-07-12 17:28:59