【发布时间】:2017-06-22 10:31:49
【问题描述】:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题是它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。
有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新计算子集,而不是一次又一次地计算整个事物。
public static IEnumerable<IEnumerable<T>> SubSetsOf<T>(IEnumerable<T> source)
{
if (!source.Any())
return Enumerable.Repeat(Enumerable.Empty<T>(), 1);
var element = source.Take(1);
var haveNots = SubSetsOf(source.Skip(1));
var haves = haveNots.Select(set => element.Concat(set));
return haves.Concat(haveNots);
}
private static bool Valid(IEnumerable<int> set)
{
bool flag = false;
foreach (var element in set)
{
var f = element > 0;
if (f == flag)
{
return false;
}
flag = f;
}
return true;
}
【问题讨论】:
-
添加元素时获得的唯一新子集是包含它的子集,因此如果您在添加元素 e 之前已经知道所有子集的集合 C,则添加“S union e” C 中每个子集 S 的集合。
标签: algorithm recursion subset dynamic-programming