Tôi muốn tìm tất cả các tập con của một tập hợp nhất định loại trừ lẫn nhau và chứa càng nhiều phần tử của bộ siêu âm càng tốt. Nơi người dùng xác định ý nghĩa cho tính độc quyền:Đặt tập hợp con độc lập tối đa qua máy phát điện C#
bool exclusion<T>(T a, T b)
nơi ít nhất exclusion(a, b) == exclusion(b, a)
giữ.
Và exclusion(a, b) == true
được đảm bảo nếu a.Equals(b) == true
Mã của tôi trông như thế này:
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());
}
}
Có cách nào để biến mã này vào một iterator di chuyển qua các giá trị được chấp nhận từng người một?
Edit:
Có vẻ như tôi là tôi ít unprecise trong câu hỏi của tôi, xin lỗi. Tôi đã thực sự tìm kiếm một máy phát điện để thực hiện deffered. Vì vậy mà mỗi khi bạn gọi nó là chỉ tập được chấp nhận tiếp theo được tính
ngoài bất kỳ vấn đề nào khác khi tính toán mã băm bằng xor tất cả các giá trị gethashcode không phải là cách tiếp cận tốt nhất. –
@MitchWheat mọi đề xuất cách thực hiện tốt hơn? – Maxwell
Vì vậy, bạn đang tìm kiếm tất cả [bộ độc lập tối đa] (http://en.wikipedia.org/wiki/Maximal_independent_set)? – svick