2012-11-19 7 views
7

Tôi không thể sử dụng bất kỳ thư viện bên ngoài nào, vì vậy tôi đang cố gắng nghĩ ra một số cách để tự xây dựng cấu trúc dữ liệu. Tôi đã nghĩ có thể một cái gì đó như thế này:Một số cách tôi có thể đại diện cho biểu đồ có trọng số, hướng vào Java là gì?

public class Node{ 
    Set<Edge> adjacent; 
    int value; 
} 

public class Edge{ 
    Node target; 
    int weight; 
} 

Nhưng tôi đoán có lẽ có cách tốt hơn để làm điều đó.

Việc sử dụng cuối cùng của tôi cho biểu đồ này là chạy thuật toán Bellman Ford trên đó, nhưng rõ ràng là tôi cần một biểu đồ hoạt động trước!

Trả lời

10

Câu trả lời phụ thuộc rất nhiều vào các thuật toán bạn dự định áp dụng cho biểu đồ của mình.

Có hai cách phổ biến để biểu thị biểu đồ - một số adjacency listadjacency matrix. Trong trường hợp của bạn, và ma trận kề là một mảng vuông của các số nguyên đại diện cho trọng số. Đại diện của bạn sử dụng danh sách kề.

Có các thuật toán hoạt động tốt hơn trên ma trận kề (ví dụ: thuật toán Floyd-Warshall). Các thuật toán khác hoạt động tốt hơn trên danh sách kề (ví dụ: thuật toán Dijkstra). Nếu đồ thị của bạn thưa thớt, sử dụng ma trận kề có thể bị cấm.

+0

Bằng cách làm việc tốt hơn bạn có nghĩa là họ có hiệu quả hơn? – Hoser

+1

@Hoser Trong hầu hết các trường hợp, câu trả lời là "có". Các trường hợp đặc biệt, chẳng hạn như Floyd-Warshall, yêu cầu ma trận hoạt động. Bạn có thể giữ cho danh sách kề đại diện cho đến khi bạn chạy thuật toán, xây dựng ma trận để chạy nó, và cuối cùng chuyển đổi ma trận trở lại danh sách kề. – dasblinkenlight

+0

Được rồi, cảm ơn. Điều gì về một trong những điều này làm cho chúng hỗ trợ hướng? Họ có thực sự thực thi chỉ đạo hay liệu tôi có phải quản lý bản thân mình không? – Hoser

2

Như thường lệ, bạn có thể biểu thị biểu đồ dưới dạng Danh sách Adjacency hoặc Ma trận Adjacency. Sự lựa chọn thực sự phụ thuộc vào các chi tiết của vấn đề của bạn.

Sử dụng ma trận Adjacency, bạn có thể chỉ cần có ma trận số nguyên, biểu thị trọng số.

Nếu bạn quyết định có danh sách Adjacency, bạn có thể lưu trữ danh sách các số nguyên (giả sử các nút của biểu đồ của bạn được xác định bằng giá trị số nguyên), tương tự như những gì bạn đã thực hiện.

+0

Liệu một kề ma trận hỗ trợ trọng lượng cạnh ? – Hoser

+1

Có, tôi đã sửa câu trả lời. Bạn có thể có trọng số trên ma trận (dòng X, col Y có val Z, có nghĩa là chi phí từ X đến Y là Z) – leo

+0

Được rồi, cảm ơn bạn. Ma trận adjacency có vẻ như là một cách tốt để làm điều này. Nó hỗ trợ yêu cầu hướng như thế nào? Có lý do cụ thể nào là ma trận kề buộc buộc bạn phải đi một cách nào đó giữa các nút, hay chỉ là một cái gì đó tôi cần phải chắc chắn để tránh. – Hoser

0

Bạn có thể sử dụng một nút như trong một đồ thị không trọng số, cầm một danh sách các nút mà nó được kết nối, và bổ sung thêm các trọng liên quan đến việc kết nối như:

public class Node{ 
    int value; 
    HashMap<Node,Integer> adjacency; 
}