2011-03-17 78 views
0

我不知道如何從x組數據中獲得所有可能性,而不是使用x嵌套for循環,我不想這樣做,因爲我不知道x的值,這使得它非常可能的數量for循環硬編碼不等於所需循環的數目。如何從多個樹中獲取所有組合?

說我有:

A:1,2,3,4 
B:2,4,65,2 
C:1,3,2 
D:2,8 

,我想從每個組1項的每一個組合(在我的代碼,使用std::vector <myclass> IM),會怎麼做呢?有人可以發佈一個一般的僞代碼,我可以按照這樣做嗎?

+0

命令是否重要?我的意思是它是排列還是組合?因爲你的問題說「從每個組獲得1個項目的每個組合」 – 2011-03-17 02:11:05

+0

組合。我的錯。我總是得到那些2困惑 – treehugger 2011-03-17 02:25:41

回答

0

如果你不知道你有多少'組',我想你至少有一些它們的集合?即所有矢量的數組/矢量?

如果是這樣,這裏有什麼工作

void iterateAllCombinations(array_of_groups, current_group_index,temp_result,callback_function) 
{ 
    current_group = array_of_groups[current_group_index] 
    for each element in current_group 
    { 
    temp_result[current_group_index]=element 
    if current_group_index>0 
     iterateAllCombinations(array_of_groups,current_group_index-1,temp_result,callback_function) 
    else 
     callback_function(temp_result) 
    } 
} 

this would be called in some fashion like: 
iterateAllCombinations(my_groups,my_groups.length-1,new vector[my_groups.length],&do_something_with_array) 

發生了什麼事情的基本解釋一個總體思路: 當你調用該函數,它將開始通過每一個項目上的「頂」組會(array_of_groups中的最後一個)。如果除了「頂級」組之外還有更多組,它會調用相同的功能,傳遞當前的項目,並告訴它看下一組。

這下一個級別將開始貫穿每個項目,並行爲相同的方式。這一直持續到你到底層組,在那裏,而不是調用另一個層次,它將所有結果的集合傳遞給你的回調函數,這個函數將使用它們。

當最低級別通過所有項目時,它將返回到下一級別,它仍處於其'for each'循環中。下一級將進入下一個項目,並調用最低級別,這將從頭開始。這一直持續下去,直到最終甚至是「最高」級別通過每個項目。


這就是僞代碼,具體情況因您的語言而異。 'temp result'可以是一個聲明和分配的前期數組(如我在僞代碼中所示),或者它可以是在每次遞歸調用之前被推送並在之後彈出的堆棧,或者它可以是數組/ vector,在每次遞歸調用之前複製並追加。你甚至可以有一個鏈表,每個節點只存儲在棧函數調用的棧幀中,而你只需要將「父」的指針傳遞到下一層。

如果你有一件你想要做的事情,你可以用這個特定的東西代替'callback_function'。或者,如果你的語言允許的話,你可以用它作爲迭代器/生成器,並且讓這個'回調'隱含起來

如果你真的討厭遞歸代碼,你可以寫一個while循環,但它是將其作爲遞歸函數寫得更直接。

+0

謝謝!即時通訊使用C + +和即時通訊嘗試排序通過類(如在學校,而不是編程對象)時間來找出所有的可能性工作 – treehugger 2011-03-17 03:08:37

+0

啊。那麼在這種情況下,做所有的組合可能有點暴躁,而且速度很慢。如果你只是想找到一個工作時間表(或所有時間表),我敢肯定有更有效的方法。如果沒有別的辦法,你可能會想要檢查方法的每個級別的衝突,而不僅僅是在最後,以避免*很多不必要的循環。 – YenTheFirst 2011-03-17 03:43:10

相關問題