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。,像这样