我想查找給定集合中所有相互排斥並且包含儘可能多的超集元素的子集。當用戶定義了排他性意義:通過c#生成器設置最大獨立子集
bool exclusion<T>(T a, T b)
其中至少exclusion(a, b) == exclusion(b, a)
成立。
而且exclusion(a, b) == true
如果a.Equals(b) == true
我的代碼看起來是這樣的保證:
public static HashSet<HashSet<T>> MutuallyExclusive<T>(this IEnumerable<T> available, Func<T, T, bool> exclusion) {
HashSet<HashSet<T>> finished = new HashSet<HashSet<T>>(new HashSetEquality<T>());
Recursion<T>(available, new HashSet<T>(), finished, exclusion);
return finished;
}
private static void Recursion<T>(IEnumerable<T> available, HashSet<T> accepted, HashSet<HashSet<T>> finished, Func<T, T, bool> exclusion) {
if (!available.Any())
finished.Add(accepted);
else
foreach (T a in available)
Recursion<T>(available.Where(b => !exclusion(a, b)), new HashSet<T>(accepted) { a }, finished, exclusion);
}
private class HashSetEquality<T> : IEqualityComparer<HashSet<T>> {
public bool Equals(HashSet<T> x, HashSet<T> y) {
if (x.Count != y.Count)
return false;
return x.All(t => y.Contains(t));
}
public int GetHashCode(HashSet<T> obj) {
return obj.Aggregate(0, (i, t) => i^t.GetHashCode());
}
}
有沒有辦法把這個代碼轉換成一個迭代器通過接收到的值逐一移動?
編輯:
看來我是我在我的問題有點unprecise,對不起。我實際上正在尋找一個發生器來執行執行。所以,每次你調用它只剩下一接受的一套計算
除了通過xor計算哈希碼的所有其他問題之外,所有的值gethashcode都不是最好的方法。 – 2013-03-09 02:59:55
@MitchWheat有什麼建議如何做得更好? – Maxwell 2013-03-09 14:37:52
所以,你正在尋找所有[最大獨立集](http://en.wikipedia.org/wiki/Maximal_independent_set)? – svick 2013-03-09 15:30:54