【问题标题】:Generate all sets of size N from a SMALLER set of size K objects从一组较小的大小为 K 的对象中生成所有大小为 N 的集合
【发布时间】:2016-07-02 00:01:57
【问题描述】:

给定一组 K 个对象,生成所有大小为 N(其中 N > K)的集合。例如,从集合 {1,2} (K=2},生成所有大小 N=3 的集合将导致以下输出集合:{1,1,1} {1,1,2},{ 1,2,1},{2,1,1},{2,2,1},{2,1,2},{1,2,2},{2,2,2}。什么是生成此类集合的有效算法?

Ken White 的注意事项:我的研究只发现了处理 C(m n) 的算法,其中 n

也许我之前的帖子不清楚,但您的回复 - “请原谅我完全没有努力,但是有人可以为我写这段代码吗?稍后再回来取它。Tx 再见。- Ken White 6 月 27 日22:54" 非常专业且乐于助人。

【问题讨论】:

  • 这是一个不可能的目标,因为{2,2,2} 不是一个可能的集合。如果您使用的是列表,则问题很容易解决,但是尚不清楚还有哪些工作需要完成。从一组 M 个项目中抽取 N 次样本非常容易,并且有放回。
  • 您在基础K 中计数0(K^N) - 1

标签: combinatorics


【解决方案1】:

您可以为这些集合分配一个订单,这样您就不会重新访问您已经处理过的任何一个。从K[0] 出现0 次,K[1] 出现0 次,最后K[last] 出现N 次的所有集合开始。然后考虑当K[last-1] 出现1 次等时,每次您已经分配的元素总和达到N 时都会缩短您的搜索。

伪代码:

addAllSets(N, K, 0, new int[K], new Set()) //Initial call

addAllSets(int targetCount, int K, int index, int[] prefix, Set allSets){
    if (index < k): //We still have the rest of the elements to consider
        for i in range 0 to targetCount - 1: 
            prefix[index] = i //Try it with i of this element
            addAllSets(targetCount - i, K, index + 1, prefix.copy, allSets) //Recursively check remaining elements
    prefix[index] = targetCount //Or just fill in the rest of the set with copies of this element
    allSets.add(prefix) //Add this to the set of sets

前缀存储一些元素的计数(调用函数时,总计数将始终为K - targetCount。)每次我们“填充”时,我们将其添加到所有集合的集合中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多