我有三套,说:
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
如何用伪代码编写程序背后的逻辑?
答案 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)