这个程序的伪代码(Matlab)

时间:2015-06-22 05:34:34

标签: algorithm 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

如何用伪代码编写程序背后的逻辑?

1 个答案:

答案 0 :(得分: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
}

在此代码中,[]表示列表或向量,{}表示字典或映射,而代字号~表示列表并置。递归周围的计数递减和递增会从项目池中临时删除项目。

在您的示例中,池由三个列表组成,您可以使用#3; d像这样调用函数:

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