我想找到所有十个元素组合而不重复,例如,如果我们有一个数组[0,1,2,3,4]
并且我想找到所有三元素组合而不重复包含数字{{ 1}}我得到以下结果:0
搜索方法应该很快 - 找到所有组合,然后过滤太长,例如搜索k = 10 n = 64的组合会给出0,1,2; 0,1,3; 0,1,4; 0,2,3; 0,2,4; 0,4,3;
组合并生成内存不足异常(16GB) RAM,i7 7600U)
此方法耗时太长。
要搜索所有组合,例如151473214816
或k = 2
我使用以下方法:
k = 3
我应该如何修改此方法以仅选择包含特定数字的组合或如何看起来是新的?
该方法可能不应该搜索所有可能的组合,然后过滤它们只是为了重新创建它们(递归地?)只有具有特定数字的那些但我不知道如何编写这样的方法或修改现有的方法。 / p>
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我使用这种方法:
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}
这将只返回与特定实例的组合:
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k, T instance)
{
if( k == 0 || !elements.Contains(instance)) return new[] { new T[0] };
return elements.Where(x => !Equals(x, instance)).Combinations(k - 1).Select(c => (new[] {instance}).Concat(c));
}
这个想法很简单:在没有实例的情况下从列表中获取所有组合(k-1个元素),并将实例添加到结果中。
我从未检查过它的性能。如果您想要并分享您的结果,您可以尝试一下。虽然组合的数量应该相同,但我不希望这些方法有任何重大差异。