2015-06-22 62 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)