2009-06-04 41 views
8

Tôi có một lớp có danh sách "phụ thuộc" trỏ đến các lớp khác thuộc cùng một loại cơ sở.Cách sắp xếp dựa trên phụ thuộc?

class Foo(Base): 
    dependencies = [] 

class Bar(Base): 
    dependencies = [Foo] 

class Baz(Base): 
    dependencies = [Bar] 

Tôi muốn sắp xếp các trường hợp mà các lớp này tạo dựa trên phụ thuộc của chúng. Trong ví dụ của tôi, tôi mong đợi các trường hợp của Foo đến trước, sau đó là Bar, sau đó là Baz.

Cách tốt nhất để sắp xếp điều này là gì?

+1

Bạn đang hỏi về một loại tôpô bằng Python? http://en.wikipedia.org/wiki/Topological_sorting –

+1

Có thể muốn tìm "phân loại đồ thị có hướng", vì đó là những gì bạn đang cố gắng làm. –

Trả lời

18

Nó được gọi là một loại topo.

def sort_deps(objs): 
    queue = [objs with no dependencies] 
    while queue: 
     obj = queue.pop() 
     yield obj 
     for obj in objs: 
      if dependencies are now satisfied: 
       queue.append(obj) 
    if not all dependencies are satisfied: 
     error 
    return result 
+0

Mặc dù quyền của bạn về giải pháp cần thiết, đây không thực sự là một ví dụ hoàn chỉnh/có thể sử dụng được. – sleepycal

+0

@sleepycal: Trang web này là để trả lời câu hỏi, không phải để cung cấp giải pháp hoàn chỉnh cho vấn đề của bạn. –

+1

Đó là một đối số kém, bạn đã đăng một đoạn mã không hoạt động. Không có gì ngoài sự lười biếng. – sleepycal

5

Tôi đã có câu hỏi tương tự chỉ tuần trước - tôi muốn biết về Stack Overflow! Tôi săn lùng xung quanh một chút cho đến khi tôi nhận ra rằng tôi có một số DAG (Được chỉ định Tuần hoàn Đồ thị vì phụ thuộc của tôi không thể đệ quy hoặc tròn). Sau đó, tôi tìm thấy một vài tài liệu tham khảo cho các thuật toán để sắp xếp chúng. Tôi đã sử dụng một traversal chiều sâu đầu tiên để có được các nút lá và thêm chúng vào danh sách được sắp xếp đầu tiên.

Dưới đây là một trang mà tôi thấy hữu ích:

Directed Acyclic Graphs

+2

Thú vị ... nhưng không có liên kết đến các tài nguyên khác. Bạn có thể cung cấp một số liên kết để hoàn thành câu trả lời cho câu hỏi này không? –

+2

Tôi đã thêm một liên kết ở trên. Là mới, nó sẽ chỉ cho phép tôi bao gồm một trong bài viết của tôi, vì vậy đây là một số khác có một số nền tảng tốt: http://www.codeproject.com/KB/java/BFSDFS.aspx –

+0

Cảm ơn, liên kết bạn đã cung cấp trong câu trả lời của mình là khá tốt. Tôi chỉ muốn các loại trường đại học này thực sự có thể chèn một hình ảnh thực sự một lần trong một thời gian chứ không phải là nghệ thuật ansi. hehe – Soviut

Các vấn đề liên quan