如何从数字列表中获取所有可能的组合?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我正在寻找一种有效的方法来实现这一点:

  • 你有一个数字1...n的列表(通常是:1.5或1...7左右---相当小,但可能因情况而异)
  • 对于这些数字,你需要所有长度的组合,例如,只有一个数({1},{2},…{n})的所有组合,然后是两个不同数字({1,2},{1,3},{1,4}…{n-1,n})的所有组合,然后这些数字的所有组合({1,2,3},{1,2,4})等等。

基本上,在这个群中,顺序是无关的,所以{1,2,3}等于{1,3,2}--这只是从这个列表中得到所有x数组的问题。

似乎应该有一个简单的算法来解决这个问题--但到目前为止,我一直在徒劳地搜索。大多数组合和置换算法似乎都考虑到了顺序(例如123不等于132),它们似乎总是对单个字符或数字进行运算...

有人有一个很棒的,很好的快速算法吗??

提问于
用户回答回答于

只需增加一个二进制数字并采用与设置的位相对应的元素。

例如,00101101意味着将索引为0,2,3和5的元素。由于你的列表只是1..n,因此元素仅仅是索引+ 1。

这将生成按顺序的permuatations。换句话说,只会{1, 2, 3}生成。不{1, 3, 2}{2, 1, 3}{2, 3, 1}等等

用户回答回答于

Google给了我这个解决方案:

public IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> list)
{
    return from m in Enumerable.Range(0, 1 << list.Count)
              select
                  from i in Enumerable.Range(0, list.Count)
                  where (m & (1 << i)) != 0
                  select list[i];
}

扫码关注云+社区