2015-06-22 64 views
-2

我有三套,說:僞對這一計劃的實現(matlab)

a=[1 1 1 1]; 

b=[2 2 2]; 

c=[3 3]; 

現在,我不得不採取3個單元,從所有集合找出所有獨特的組合..

所以在MATLAB ,我可以做到這一點:

>> a=[1 1 1 1]; 
>> b=[2 2 2]; 
>> c=[3 3]; 
>> all=[a b c]; 
>> nchoosek(all,3) 
>> unique(nchoosek(all,3),'rows') 

的O/p爲:

 1  1  1 
    1  1  2 
    1  1  3 
    1  2  2 
    1  2  3 
    1  3  3 
    2  2  2 
    2  2  3 
    2  3  3 

如何以僞代碼編寫程序背後的邏輯?

+2

那麼,什麼是集合的實際意義?它看起來像你從'[1,1,1,1,2,2,2,3,3]'中選擇了三個數字... ... –

+0

我想說你最好先用你自己的語言解釋算法。 – bdecaf

+0

你確定你不打算從三組中的每組中取出一個數字來創建所有組合嗎? – nkjt

回答

0

這是我會怎麼做:

  • 創建項目計數的字典。
  • 在此詞典上遞歸k次,注意不要選擇不再或不在池中的物品。
  • 遞歸時,跳過比當前項目更小(按某種標準)的項目以獲得唯一列表。

在僞代碼:

function ucombok_rec(count, k, lowest) 
{ 
    if (k == 0) return [[]]; 

    var res = []; 

    for (item in count): 
     if (item >= lowest && count[item] > 0) { 
      count[item]--; 

      var combo = ucombok_rec(count, k - 1, item); 

      for (c in combo) res ~= [[item] ~ c]; 
      count[item]++; 
     } 

    return res; 
} 

function ucombok(s, k) 
{ 
    if (!s) return [];      // nothing to do 

    var count = {}; 
    var lowest = min(s);     // min. value in set 
    for (item in s) count[item]++;   // create item counts 

    return ucombok_rec(count, k, lowest); // recurse 
} 

在此代碼,[]表示列表或向量,{}字典或地圖和波浪~裝置列表串聯。計數在遞歸週期遞減並遞增,從項目池臨時移除項目。

在您的例子,那裏的游泳池是由三個列表,你倒是調用該函數是這樣的:

c = ucombok(a ~ b ~ c, 3)