从数字列表中获取所有可能的组合
我正在寻找一种有效的方法来实现这一点:
-
你有一个数字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个数字组的问题
似乎应该有一个简单的algorithm – 但我迄今为止徒劳无功。 大多数组合和排列algorithm似乎a)考虑到顺序(例如123不等于132),他们总是似乎操作一个单一的string或数字….
任何人都有一个伟大的,不错的快速algorithm,他们的袖子?
谢谢!
只需增加一个二进制数字,并采取与设置的位相对应的元素。
例如, 00101101
意味着将索引为00101101
和5的元素。由于您的列表只是1..n,因此元素只是索引+ 1。
这将产生按顺序permuatations。 换句话说,只会生成{1, 2, 3}
。 不是{1, 3, 2}
或{2, 1, 3}
或{2, 3, 1}
等
不是我的代码,但你正在寻找powerset。 谷歌给了我这个解决scheme,这似乎工作:
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]; }
资料来源: http : //rosettacode.org/wiki/Power_set#C.23
这是我过去为完成这个任务而写的东西。
List<T[]> CreateSubsets<T>(T[] originalArray) { List<T[]> subsets = new List<T[]>(); for (int i = 0; i < originalArray.Length; i++) { int subsetCount = subsets.Count; subsets.Add(new T[] { originalArray[i] }); for (int j = 0; j < subsetCount; j++) { T[] newSubset = new T[subsets[j].Length + 1]; subsets[j].CopyTo(newSubset, 0); newSubset[newSubset.Length - 1] = originalArray[i]; subsets.Add(newSubset); } } return subsets; }
它是通用的,所以它可以用于整数,长整数,string,Foos等。