performance - k-size 可能的数字组合按每个总和排序

标签 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 .

最佳答案

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

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

如果你想要 Set 中每个数字数组的索引(具有唯一数字),SSC 中的 num_arr 索引使用此代码

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

此代码返回 [1,3,5] for Index 中的 [9,6,1]
< br/> 对于更大的 n
在这种情况下,计算非常耗时,甚至不切实际。一个近似可以解决这个问题,对于这种情况,您可以通过修改Matlab中的nchoosek.m找到第一个任意答案。

关于performance - k-size 可能的数字组合按每个总和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120772/

相关文章:

c - 哪个更快,乘法还是减法?

mysql - 优化大表中的 SELECT

algorithm - 非常简单的时间复杂性问题

ruby - 4x4 字母网格 - 单词生成器 - 与 friend 争夺

algorithm - 加起来为总和的唯一数字组合

Mysql 日期字段索引

在 R 中快速生成约 10^9 步骤的随机过程

algorithm - 信道分配算法

c++ - 生成字符串 vector 的所有组合

Python - 列表组合