从SMALLER大小为K的对象

时间:2016-07-02 00:01:58

标签: combinatorics

给定一组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

也许我之前的帖子不清楚,但是你的回答 - “请原谅我完全缺乏努力,但有人可以为我写这个代码吗?稍后再回来拿起它。再见。 - Ken White Jun 27 at 22:54“非常专业,乐于助人。

1 个答案:

答案 0 :(得分:0)

您可以为套装分配订单,这样您就不会重新访问已经处理过的任何订单。从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。)每次“填充”时,我们将其添加到所有集合的集合中。