k 大小 p 的不同组合,无需替换

Posted

技术标签:

【中文标题】k 大小 p 的不同组合,无需替换【英文标题】:k distinct combination of size p without replacement 【发布时间】:2016-04-18 11:08:29 【问题描述】:

从整数1,...,N 我想取k 个随机不同的组合,而不重复大小p。例如,如果N=10k=4p=3,可能的结果是:

1 4 9
9 4 2
3 5 2
1 8 4

但不是:

1 4 9
9 4 2
3 5 3
1 9 4

有两个原因:

    [1 4 9][1 9 4] 是相同的组合。

    [3 5 3] 并非没有重复。

请注意,获取所有可能的组合并(随机)选择其中的 k 很容易遇到内存问题。

【问题讨论】:

我编辑前两个单词的原因是它包含在标签中。这就是标签的用途。其次:至少把它写成“MATLAB”,如果你坚持保留它的话,MathWorks 称之为他们的程序。 是的,我的经验是,即使它在标签中,明确地编写 Matlab,或者如你所愿 MATLAB,也会让人们更加了解它。这就是我把它放回去的原因。我不知道那是一种犯罪,看到别人又把它拿出来了…… 这不是犯罪,只是多余的。人们通常通过语言标签浏览,因此通过 MATLAB-tag 结束了这个问题。 SO 倾向于使问题尽可能简短和中肯,以便未来的用户可以尽快找到所需的信息;这也是我删掉第一段的原因。安德再次编辑它的原因可能是因为即使将语言名称放在那里并不是很不寻常或多余的,但粗体格式使它无缘无故地脱颖而出。 @EricSchols 这不是刑事犯罪,但使用粗体字和最糟糕的 MATLAB 拼写(/matlab 对我来说)很容易达到某些人的门槛:) 我敢肯定没有冒犯的意思,把它当作一个友好的建议(你会看到有 很多 编辑在其他人的帖子中更改了不太合理的内容。) 好的,谢谢两位。 【参考方案1】:

好的,我找到了适合我的解决方案。我主要担心的是:

我希望k 组合是随机的。 处理时间。

以下函数在每次迭代时对大小为p(即row = randperm(N,p))的单个随机组合进行采样,并在该组合不存在时添加该组合。

这三个参数中,主要是k影响处理时间。对于不太大的k,此代码在几秒钟内运行。我自己会遇到的最极端的情况是N = 10^6, k = 2000, p = 10,它仍然在1秒内运行。

我希望这对其他人也有帮助,因为我在多个网站上都遇到过这个问题,但没有满意的答案。

function C = kcombsn(N,k,p)
    C       = randperm(N,p);
    Csort   = sort(C,2);

    while size(C,1) < k

        row = randperm(N,p);
        row_sort = sort(row);

        if isempty(intersect(row_sort,Csort,'rows'))
            C = [C; row];
            Csort = [Csort; row_sort];
        end
    end

end

编辑: 我也posted the code on the MATLAB File Exchange。

【讨论】:

以上是关于k 大小 p 的不同组合,无需替换的主要内容,如果未能解决你的问题,请参考以下文章

使列表中所有可能的值组合大小不同

从数字集 N 生成长度 k 的组合,顺序很重要,允许替换

在C中创建n个项目的k和m个组合的所有可能子集[重复]

找到至少大小为 k 到 n 的所有组合

模意义下的组合数

快速的独特组合(来自有重复的列表),无需查找