每个总和排序的k大小可能的数字组合

时间:2014-08-04 14:14:06

标签: performance algorithm combinations permutation combinatorics

给出一组n个数字;什么是以降序生成所有可能的k - 大小子集的代码(减少每个值的总和)?

示例:

Set={9,8,6,2,1} => n=5k=3。所以输出是:

[9,8,6] 
[9,8,2]
[9,8,1]
[9,6,2]
[9,6,1]
[8,6,2]
[8,6,1]
[9,2,1]
[8,2,1]
[6,2,1]

这是最有效的算法,但具有NP完全复杂度的算法(n选择k排列)仍然是答案。
Matlab Code中的一个一代是实施的首选。或者可以确定其中有序列表的最大大小的解决方案(通过这个,对于更大的n和k,可以使用近似并返回该列表的特定大小而不计算所有可能性。)
注意:
1)请注意此有序列表中[9,2,1]的位置。所以指数排序不是正确的答案 2)这可能是一种Lexicographical order

1 个答案:

答案 0 :(得分:0)

感谢Divakar,Yvon和Luis,这个问题的可能答案之一:
SSC中有分类集合组合,所以

combs = nchoosek(Set,k);
[~,ind] = sort(sum(combs,2),'descend');
SSC = combs(ind,:);

如果您希望Set中每个数字数组的索引(具有唯一编号),num_arr中的SSC索引使用此代码

for i=1:k
    Index(i)=find(SSC(num_arr,j)==Set(1,:));
end

此代码在[1,3,5]中为[9,6,1]返回Index

更大n
在这种情况下,计算非常耗时甚至是不切实际的。近似可以解决此问题,对于这种情况,您可以通过修改nchoosek.m中的Matlab找到第一个任意答案。