我正在尝试获取列表的所有预定义长度的排列,仅按升序排列。升序列表排列
For example, take the set: "ABCDE"
I'd like the returning result to be:
ABC, ABD, ABE, ACD, ACE, ADE, BCD, BCE, BDE, CDE
换句话说,一个“B”可以从未一个“A”(上升顺序)之前出现,但我希望此要求范围内的每个变化。我不想使用LINQ,我试图找出最快的方式来实现(速度是这个应用程序中的一个因素)。
到目前为止,我有字符的列表的列表:
List<List<char>> Combinations;
其中内“列表”将会像“ABC”(每个字母是一个字符的组合),以及外列表会所有组合的列表。
每个结果集(在上面的例子中是3)的长度需要是动态的,所以我想我需要某种递归......我只是不知道如何实现它。
任何帮助将不胜感激!
编辑
到目前为止,这是我有什么(我觉得我越来越近......我只是无法得到它的实际构建的最终名单(工会不工作 - 我使用它错误地):
private List<List<char>> AscendingPermute(List<char> InMovements, int Combinations)
{
List<List<char>> Ret = new List<List<char>>();
for(int i = 0; i <= InMovements.Count - Combinations; i++)
{
if(Combinations <= 1){
Ret.Add(new List<char>() {InMovements[i] });
return Ret;
}
else
{
Ret.Union(AscendingPermute(InMovements.GetRange(1, InMovements.Count - 1), Combinations - 1));
}
}
return Ret;
}
我在正确的轨道上我缺少什么
感谢
有可能性('2^N'确切)指数数量,你不会如果你真的想要所有这些,速度会变得太快。 – amit 2012-04-04 20:13:01
你到目前为止有什么? – 48klocs 2012-04-04 20:14:02
我认为有nCk的可能性(n是第一个列表的长度,k是结果中每个列表的长度),那不是2^n。 – zmbq 2012-04-04 20:14:44