c# - 需要幂集/子集组合的算法,但仅适用于固定数量的元素
c# - Algorithm for Power Set / Sub-Set combinations required, but only for a fixed number of elements
好的,
这是这个问题的扩展-列表中的超级集合:
Getting all possible combinations from a list of numbers
这有帮助,但是 returns 所有子集:
http://rosettacode.org/wiki/Power_set#C.23
但我需要的是只检索具有固定数量的子集。 IE。假设我的列表是数字的集合:
1
2个
3个
4个
5个
6
我只想要 4 个数字的不同组合,即
1,2,3,4
1,2,3,5
1,2,3,6
1,3,4,5
1,3,4,6
1,4,5,6
2,3,4,5
2,3,4,6
2,4,5,6
3,4,5,6
我以数字为例,但在我的解决方案中,我正在处理其他类型的对象。
我 100% 确定这对于知道的人来说很容易解决....
提前致谢
假设您总是想要 4,使用嵌套 for 循环编写该算法相对容易。
var set = new[] {1, 2, 3, 4, 5, 6};
for (int firstIndex = 0; firstIndex < set.Length; firstIndex++)
{
for (int secondIndex = firstIndex+1; secondIndex < set.Length; secondIndex++)
{
for (int thirdIndex = secondIndex+1; thirdIndex < set.Length; thirdIndex++)
{
for (int fourthIndex = thirdIndex+1; fourthIndex < set.Length; fourthIndex++)
{
Console.WriteLine(string.Format($"{set[firstIndex]}, {set[secondIndex]}, {set[thirdIndex]}, {set[fourthIndex]}"));
}
}
}
}
如果您需要它是动态的并支持不同的列表大小(即它并不总是 4 个),那么将其转换为递归 N 次的递归调用可能更容易。
您可以通过过滤结果的长度来扩展您引用的解决方案
public IEnumerable<IEnumerable<T>> GetPowerSetOfLength<T>(List<T> list, int length)
{
return from m in Enumerable.Range(0, 1 << list.Count)
//because doing a count will iterate through the enumerable
//better to just convert it to a list up front
let setResult = ( from i in Enumerable.Range(0, list.Count)
where (m & (1 << i)) != 0
select list[i]).ToList()
where setResult.Count==length
select setResult;
}
这里有一个 link to a dot net fiddle 正在使用此代码,如果您想对其进行测试
好的,
这是这个问题的扩展-列表中的超级集合:
Getting all possible combinations from a list of numbers
这有帮助,但是 returns 所有子集: http://rosettacode.org/wiki/Power_set#C.23
但我需要的是只检索具有固定数量的子集。 IE。假设我的列表是数字的集合:
1 2个 3个 4个 5个 6
我只想要 4 个数字的不同组合,即 1,2,3,4 1,2,3,5 1,2,3,6 1,3,4,5 1,3,4,6 1,4,5,6 2,3,4,5 2,3,4,6 2,4,5,6 3,4,5,6
我以数字为例,但在我的解决方案中,我正在处理其他类型的对象。
我 100% 确定这对于知道的人来说很容易解决....
提前致谢
假设您总是想要 4,使用嵌套 for 循环编写该算法相对容易。
var set = new[] {1, 2, 3, 4, 5, 6};
for (int firstIndex = 0; firstIndex < set.Length; firstIndex++)
{
for (int secondIndex = firstIndex+1; secondIndex < set.Length; secondIndex++)
{
for (int thirdIndex = secondIndex+1; thirdIndex < set.Length; thirdIndex++)
{
for (int fourthIndex = thirdIndex+1; fourthIndex < set.Length; fourthIndex++)
{
Console.WriteLine(string.Format($"{set[firstIndex]}, {set[secondIndex]}, {set[thirdIndex]}, {set[fourthIndex]}"));
}
}
}
}
如果您需要它是动态的并支持不同的列表大小(即它并不总是 4 个),那么将其转换为递归 N 次的递归调用可能更容易。
您可以通过过滤结果的长度来扩展您引用的解决方案
public IEnumerable<IEnumerable<T>> GetPowerSetOfLength<T>(List<T> list, int length)
{
return from m in Enumerable.Range(0, 1 << list.Count)
//because doing a count will iterate through the enumerable
//better to just convert it to a list up front
let setResult = ( from i in Enumerable.Range(0, list.Count)
where (m & (1 << i)) != 0
select list[i]).ToList()
where setResult.Count==length
select setResult;
}
这里有一个 link to a dot net fiddle 正在使用此代码,如果您想对其进行测试