Điều này giống như trường hợp cuối cùng bạn có thể áp dụng câu hỏi phỏng vấn đó: tìm một chu trình trong danh sách được liên kết chỉ sử dụng bộ nhớ O (1).
Trong trường hợp này, "danh sách được liên kết" của bạn là chuỗi các phần tử bạn liệt kê.Sử dụng hai điều tra viên, chạy một ở tốc độ một nửa, và nếu một nhanh chóng bao giờ chạy vào một chậm sau đó bạn có một vòng lặp. Đây cũng sẽ là thời gian O (n) thay vì thời gian O (n^2) cần thiết để kiểm tra danh sách 'nhìn thấy'. Nhược điểm là bạn chỉ tìm hiểu về vòng lặp sau khi một số nút đã được xử lý nhiều lần.
Trong ví dụ, tôi đã thay thế phương pháp 'nửa tốc độ' bằng phương pháp 'đánh dấu thả' đơn giản hơn để viết.
class GenTreeNode {
...
///<summary>Wraps an the enumeration of linked data structures such as trees and linked lists with a check for cycles.</summary>
private static IEnumerable<T> CheckedEnumerable<T>(IEnumerable<T> sub_enumerable) {
long cur_track_count = 0;
long high_track_count = 1;
T post = default(T);
foreach (var e in sub_enumerable) {
yield return e;
if (++cur_track_count >= high_track_count) {
post = e;
high_track_count *= 2;
cur_track_count = 0;
} else if (object.ReferenceEquals(e, post)) {
throw new Exception("Infinite Loop");
}
}
}
...
///<summary>Enumerates the tree's nodes, assuming no cycles</summary>
private IEnumerable<GenTreeNode> tree_nodes_unchecked() {
yield return this;
foreach (var child in this.nodes)
foreach (var e in child.tree_nodes_unchecked())
yield return e;
}
///<summary>Enumerates the tree's nodes, checking for cycles</summary>
public IEnumerable<GenTreeNode> tree_nodes()
{
return CheckedEnumerable(tree_nodes_unchecked());
}
...
void ProcessTree() {
foreach (var node in tree_nodes())
proceess(node);
}
}
Nguồn
2009-03-15 04:00:05
Không có thứ gì giống như chu trình trong cây nhị phân. Ngay cả dữ liệu phả hệ chính xác cũng không phải là cây nhị phân. Tôi đã chỉnh sửa câu hỏi để đọc "đồ thị" – Triptych
tò mò, đây có phải là để tìm ra Chỉ số Liều lượng, Đánh giá Nick Werk hoặc một cái gì đó tương tự (như trong thuần chủng)? – nlucaroni
Không ... Tôi đang xuất toàn bộ phả hệ ngựa sang một tệp. Tôi cũng sẽ sử dụng nó để phát hiện cận huyết nhưng vì sản phẩm phần mềm của tôi không phải là giống cụ thể nên tôi không có nhiều dữ liệu lịch sử để phân tích. – Romias