如何生成所有组合(内存高效算法)?

时间:2018-04-07 23:24:36

标签: c# memory-management combinations

我需要一种方法来生成C#列表中元素的所有组合(非排列)(非重复,顺序无关紧要)。

我已经看到了几个建议使用递归的解决方案,但是它们需要在返回之前构建整个列表(内存效率低下)。

我希望有一种方法可以创建一个可以产生当前组合的生成器,而不会在迭代期间存储所有其他组合。有谁知道任何有效的解决方案?

2 个答案:

答案 0 :(得分:0)

使用yield return创建一个迭代器方法,如下所示:

   public class Combinations: IEnumerable<Combination> {
        public IEnumerator<T> GetEnumerator()
        {
            Combination currentCombination = Combination.FirstCombination(); 
            while (currentCombination.IsValid()) {
                yield return currentCombination;
                currentCombination = currentCombination.NextCombination(); // return invalid combo if currentCombination is the last possible combination
            }
        }
   }

当然你仍然需要编写Combination类,但这应该相对简单。您应该能够从当前组合生成下一个组合。例如,假设列表中有N个元素,您只需要增加一个包含N位数的基数N,当您这样做时,您将生成所有组合。

答案 1 :(得分:0)

M = 2^n - 1种可能的组合(如果我们排除空组合)。因此,只需在1..2 ^ n-1范围内进行for循环,并将循环计数器值映射到项目组合 - 如果设置了第k位,则组合使用第k项。例如,5=101binary对应于组合(item[0], item[2])