Nếu bạn không thể thêm thuộc tính "đã truy cập" vào nút, hãy sử dụng tập hợp (hoặc bản đồ) và chỉ cần thêm tất cả các nút đã truy cập vào nhóm trừ khi chúng đã có trong tập hợp. Sử dụng một khóa duy nhất hoặc địa chỉ của các đối tượng là "chìa khóa".
Điều này cũng cung cấp cho bạn thông tin về nút "gốc" của phụ thuộc theo chu kỳ sẽ hữu ích khi người dùng phải khắc phục sự cố.
Một giải pháp khác là cố gắng tìm sự phụ thuộc tiếp theo để thực thi. Đối với điều này, bạn phải có một số ngăn xếp, nơi bạn có thể nhớ bạn đang ở đâu và những gì bạn cần làm tiếp theo. Kiểm tra xem phụ thuộc đã có trên ngăn xếp này chưa trước khi bạn thực hiện nó. Nếu có, bạn đã tìm thấy một chu kỳ.
Trong khi điều này có vẻ phức tạp của O (N * M), bạn phải nhớ rằng ngăn xếp có độ sâu rất hạn chế (vì vậy N nhỏ) và M trở nên nhỏ hơn với mỗi phụ thuộc mà bạn có thể kiểm tra "thực hiện" cộng với bạn có thể ngừng tìm kiếm khi bạn tìm thấy một chiếc lá (vì vậy bạn không bao giờ phải kiểm tra mọi nút -> M cũng sẽ nhỏ).
Trong MetaMake, tôi đã tạo biểu đồ dưới dạng danh sách các danh sách và sau đó xóa mọi nút khi tôi thực hiện chúng, điều này sẽ tự động cắt giảm lượng tìm kiếm. Tôi không bao giờ thực sự phải chạy một kiểm tra độc lập, tất cả đều xảy ra tự động trong quá trình thực hiện bình thường.
Nếu bạn cần chế độ "chỉ thử nghiệm", chỉ cần thêm cờ "chạy khô" để vô hiệu hóa việc thực hiện các công việc thực tế.
Nguồn
2008-11-04 12:15:46
Bạn nói bạn muốn phát hiện tất cả các chu kỳ, nhưng trường hợp sử dụng của bạn cho thấy rằng sẽ đủ để phát hiện xem có bất kỳ chu kỳ nào không. –
Sẽ tốt hơn nếu phát hiện tất cả các chu kỳ để chúng có thể được cố định trong một lần, thay vì kiểm tra, sửa chữa, kiểm tra, sửa lỗi, vv .. – Peauters
Kiểm tra điều này> [Chương trình C để kiểm tra vòng lặp tự trong biểu đồ] (http: // www .msccomputerscience.com/2014/04/wap-to-check-presence-of-self-loop-in.html) – ARJUN