2012-11-01 68 views
2

我不確定如何分配遞歸程序。現在它是遞歸的,並且作爲單個程序運行,但我的目標是將此程序分發給其他只生成數據子集的機器。是否可以分發遞歸算法?

這是程序的背景。我給它一個目標(在這個例子中是10)和一個具有最小/最大權重的項目列表,並且它返回每個項目的組合。

因此,與3項,並

Low = 2, 2, 2 
high = 6, 6, 6 
Target = 10 

結果是:

2 2 4 
2 3 3 
2 4 2 
3 2 3 
3 3 2 
4 2 2 

這裏是做工作的方法:

void distribute (int i, int [] low, int [] high, final int rest, int [] sizes) { 
    // System.out.println (i + " " + rest + " " + sizes); 
    if (i == sizes.length - 1) { 
     if (rest < high [i]) { 
      sizes[i] = rest; 
      result.add (Arrays.copyOf (sizes, sizes.length)); 
     } 
    } 
    else 
     for (int c = 0; 
      c <= java.lang.Math.min (high [i] - low [i], rest); 
      ++c) { 
      sizes [i] = c; 
      distribute (i + 1, low, high, rest - c, sizes); 
     } 
} 

我想知道如果任何人有如何分配輸出的任何想法,在上面的例子中,如果我有3個服務器,每個服務器只生成2個唯一的條目而不是產生整個事情。說,事先我知道會有6個結果,並希望2分發給每臺機器我怎麼能做到這一點。這是可能的,如果是的話,邏輯是什麼?

如果有幫助,這裏的整個程序:http://pastebin.com/RikqPgKh

+0

不是你寫你想達到的目標。該計劃是做什麼的? – Bitwise

+0

它具有特定的位域,但目標是在有界(在這種情況下,min-2和max-6)獲得等於特定數字(在此情況下爲10)的不同數字組合。該輸出饋送給其他程序。 – user1735075

+0

如果這是實際的問題陳述,那麼通過分發它可以獲得任何性能增益尚不清楚。你必須做的是在遞歸的每個級別決定你是否要產生新線程或使用現有的線程。您可以在每個級別上產卵,但是創建和管理所有這些線程的開銷會淹沒您正在進行的實際處理。如果_real_問題更加複雜並且涉及I/O(線程需要等待大量時間),那麼使用固定大小的線程池進行線程化可能會提高性能。 –

回答

2

要在多臺計算機上運行的算法,然後團結結果我的身影。你只需要分割執行。這不應該太難,因爲參數已經限制了結果。

例如,而不是L:[2,2,2] H:[6,6,6]執行

L:[2,2,2] H:[3,6,6] 
L:[4,2,2] H:[5,6,6] 
L:[6,2,2] H:[6,6,6]