可能な限り多くのスーパーセットの要素を含み、相互排他的であるセットのすべてのサブセットを検索したいと思います。少なくともexclusion(a, b) == exclusion(b, a)
が成り立つC#ジェネレータを介した最大独立サブセットのセット
bool exclusion<T>(T a, T b)
:ユーザーが排他のための意味を定義するところ。
そして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だったようで、申し訳ありません。私は実際に実行のためにGeneratorを探していました。 、唯一の次受け入れられたセットが
ほかにもxorでハッシュコードを計算すると、すべての値gethashcodeが最良の方法ではありません。 –
@MitchWheatどのように改善するのですか? – Maxwell
だから、あなたはすべての[最大独立セット](http://en.wikipedia.org/wiki/Maximal_independent_set)を探していますか? – svick