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

C# 如何生成所有组合(内存高效算法)?,c#,memory-management,combinations,C#,Memory Management,Combinations,我需要一种方法来生成C#中列表中元素的所有组合(而不是排列)(不重复,顺序无关紧要) 我见过几个建议使用递归的解决方案,但是它们需要在返回之前构建整个列表(内存效率低下) 我希望有一种方法可以创建一个生成器,它可以生成当前的组合,而无需在迭代过程中存储所有其他组合。有人知道任何有效的解决方案吗?只需使用yield-return创建一个迭代器方法,如下所示: public class Combinations: IEnumerable<Combination> {

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

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


我希望有一种方法可以创建一个生成器,它可以生成当前的组合,而无需在迭代过程中存储所有其他组合。有人知道任何有效的解决方案吗?

只需使用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
            }
        }
   }
公共类组合:IEnumerable{
公共IEnumerator GetEnumerator()
{
Combination currentCombination=Combination.FirstCombination();
while(currentCombination.IsValid()){
收益-收益组合;
currentCombination=currentCombination.NextCombination();//如果currentCombination是最后一个可能的组合,则返回无效组合
}
}
}

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

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

欢迎使用堆栈溢出。这不是一个code/SQL/regex编写服务,在这里,您发布了一个需求列表和选择的语言,然后一个代码猴子为您编写代码。我们非常乐意提供帮助,但我们希望您首先自己努力解决问题。一旦你这样做了,你可以解释你的问题,包括你工作的相关部分,并提出一个具体的问题,我们会尽力帮助你。祝你好运。搜索Heap的算法。我正在寻找一个能找到组合而不是排列的解决方案。