Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 此程序的伪代码(Matlab)_Algorithm_Matlab - Fatal编程技术网

Algorithm 此程序的伪代码(Matlab)

Algorithm 此程序的伪代码(Matlab),algorithm,matlab,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为:

我有三套,比如说:

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

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

以下是我的做法:

创建项目计数字典。 在此字典上递归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
}
在这段代码中,[]表示列表或向量,{}表示字典或映射,而tilde~表示列表串联。递归前后的计数递减和递增将临时从项池中删除项

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

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

那么这些集合的实际意义是什么呢?看起来你从[1,1,1,1,2,2,2,2,3,3]中选择了三个数字…我认为你最好先用自己的话解释一下算法。你确定你不是要从三个集合中各取一个数字来获得所有组合吗?这是什么意思?一个集合不能有重复的元素!换句话说,我想通过在每个组合中最多取3个元素来找出一系列组合。现在,它可能是这样的,3个元素都来自a。,像11,同样也可能是这样的,2个元素来自a,1个元素来自b,像12。,像这样