2015-05-29 54 views
4

我有3個帶有一些可能值的變量。 例如:爲多個變量返回所有可能的組合集合的僞代碼或C#算法

Var1 - possible values: 1,2,3 
Var2 - possible values: a, b, c 
var3 - possible values: false, true 

可以請你返回所有可能的組合的方法幫助嗎?

結果如:

 1,a,false 
 1,a,true, 
 1,b,false 
 1,b,true, 
 1,c,false 
 1,c,true 
 2,a,false 
 2,a,true 
 2,b,false 
 Etc.. 

祝算法可以適用於組合中的任何水平,例如,該算法對4個或5與可變因素其他可能的值工作。

+0

爲什麼僞代碼?根據您使用的技術,將有不同的解決方案/技術來解決這個問題?例如,我可以在'T-SQL'中用很少的代碼行輕鬆解決這個問題,但在'JavaScript'中不那麼容易。 – gotqn

+0

我正在使用內部代碼的In-house bpm平臺(主要是像excel語法)。但在C#中也會很好。我可以做一個C#應用程序來適應我的目的。謝謝! – TBogdan

+0

當然。 SQL僞代碼:'SELECT * FROM Var1,Var2,Var3'。那很簡單。 :-)(肯定希望他們能嘗試高爾夫大賽*此*這類的問題。)在C#中的字符串集合的排列組合(指 – RBarryYoung

回答

1

它看起來像你想枚舉Cartesian products。假設你的項目在list_of_lists,以僞代碼這個遞歸函數將做到這一點:

enumerate_cartesian_prducts(list_of_lists): 

    if list_of_lists is empty: 
     return [[]] 

    this_list = list_of_lists[0] 
    other_lists = list_of_lists[1: ] 
    other_cartesian_products = [] 
    return [(e + other_cartesian_product) \ 
     for e in this_list and other_cartesian_product in other_cartesian_products] 

注意如何最後一行很可能是在大多數語言雙循環:它遍歷在第一列表中的所有元素,其餘的笛卡爾產品中的所有列表,並創建所有附加結果的列表。

0

假設每個變量都有一個與is關聯的集合或向量。即: SET1 = [1,2,3] SET2 = [A,B,C] SET3 = [F,T]

然後,一種方法是循環對這些集嵌套的 「for」循環。假設您的輸出結構是3元素列表的列表。也就是說,您的輸出需要如下所示: [[1,a,F],[1,a,T],[1,b,F],......] 也假設Python),你可以使用像「append」這樣的函數將一個2元素列表添加到你的大列表中。那就試試這個:

myList = [] #empty list 
for i in set1: 
    for j in set2: 
    for k in set3: 
     myList.append([i, j, k]) #Appends 3-element list to big list 

你可能需要做一個deepcopy的在附加聲明中,使所有的我的,生的,和K的arene't在主列表,在每次通過一個迭代的運行時間更新。這可能不是最高效的,但我認爲它相對簡單。

1

最簡單的解決方案是有n個嵌套循環:

for each possible value v1 in var1 
    for each possible value v2 in var2 
     for each possible value v3 in var3 
      print(v1,v2,v3); 
     end for v3 
    end for v2 
end for v1 

在更一般的情況下,讓我們假設你有(對每個變種之一)列出的清單包含N個名單和每個列表中包含可能每個變量的值。你可以用下面的遞歸函數all_combinations來解決問題。

list_of_lists=[[1...][a...][false...]]; 
current_comb=[]; 

all_combinations(list_of_lists,current_comb); 

function all_combinations(list_of_lists,current_comb) 
    if (list_of_lists=[]) 
     print(current_comb); 
     return; 
    end if 
    current_list=list_of_lists[0]; 
    remaining_lists=list_of_lists[1:end]; 
    for each v in current_list 
     tmp=current_comb;tmp.Append(v); 
     all_combinations(remaining_lists,tmp); 
    end for v 
添加變量時

當然,很快你將需要處理的組合爆炸。

+0

我想OP需要一個解決方案,只有在運行時才能知道要合併的集合的數量。 – mbeckish

+0

我更新了一般情況下的答案 – Maciej

1

唯一清潔的解決方案是:

有一個函數混合物(A,B),其採用兩個列表,並返回一個列表。這是微不足道的。

你的最終代碼看起來就像這樣:混合

result = null 
result = mix(result, one of your lists); 
result = mix(result, another of your lists); 
result = mix(result, yet another of your lists); 
result = mix(result, yet another list); 
result = mix(result, one more list); 

例如(A,B)...

mix(A,B) 
result = null 
for each A 
    for each B 
    result += AB 
return result 
-1

你真的應該在別處尋找這個,它不是一個很好的stackoverflow問題。這是作業,如果您使用適當的術語進行更多搜索,則已經有了一個算法。

這其實很簡單,如果你推廣的算法在二進制串生成的數字全部組合,你應該能夠得到它:

0 0 0 0 
0 0 0 1 
0 0 1 0 
0 0 1 1 
0 1 0 0 
0 1 0 1 
0 1 1 0 
0 1 1 1 
1 0 0 0 
1 0 0 1 
1 0 1 0 
1 0 1 1 
1 1 0 0 
1 1 0 1 
1 1 1 0 
1 1 1 1 

注意,最右邊的列交替其值的每一個細胞,而第二從右側的列交替每隔2個細胞,下一列在從交替每隔4個細胞,而最終的數字交替每隔8個細胞。

對於你的情況,覺得上面當你集是會發生什麼:

Var1 - possible values: 0,1 
Var2 - possible values: 0,1 
Var3 - possible values: 0,1 
Var4 - possible values: 0,1 

開始,保持在每一組的位置跟蹤一個計數器,並通過了「最右邊的」設置循環開始碰撞「下,由右」,由1組繼續以這種方式循環的集合,當一個「合適的」週期在碰撞一組,直到你完成了騎自行車的位置之前全職設置在「最重要的位置」。您將在集合中生成所有可能的組合。

其他的答案都集中在「給codez」,這真的只是獎勵您在這裏發佈您的家庭作業的問題,所以,我想我會至少說明了一點。

0

這裏的東西在JavaScript中這是僞代碼,等等。 (我從來沒有在C#編碼,也許我會嘗試將其轉換。)

var sets = [[1,2,3],["a","b","c"],[false,true]], 
    result = []; 

function f(arr,i){ 
    if (i == sets.length){ 
    result.push(arr); 
    return; 
    } 
    for (var j=0; j<sets[i].length; j++){ 
    _arr = arr.slice(); // make a copy of arr 
    _arr.push(sets[i][j]); 
    f(_arr,i+1); 
    } 
} 

f([],0) 

輸出:

console.log(result); 

[[1,"a",false] 
,[1,"a",true] 
,[1,"b",false] 
,[1,"b",true] 
,[1,"c",false] 
,[1,"c",true] 
,[2,"a",false] 
,[2,"a",true] 
,[2,"b",false] 
,[2,"b",true] 
,[2,"c",false] 
,[2,"c",true] 
,[3,"a",false] 
,[3,"a",true] 
,[3,"b",false] 
,[3,"b",true] 
,[3,"c",false] 
,[3,"c",true]]