0
我有一個子集算法,可以找到給定集合的所有子集。原始集的東西是它是一個不斷增長的集合,如果元素被添加到它,我需要重新計算它的子集。算法:如何在添加新元素時查找集合的子集?
有沒有一種方法可以優化可以重新計算上一個計算點的子集的子集算法,而不是一次又一次地計算整個事物。
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」添加到每個子集S的集合中在C. –