2011-08-25 5 views
6

Tôi đang làm việc bằng ngôn ngữ tối nghĩa với quản lý phụ thuộc kém. Để giúp đỡ 14000 tập tin codebase, tôi đã viết một số công cụ phân tích (trong Java) và đã tạo ra một biểu đồ phụ thuộc.Tìm các hòn đảo theo đồ thị được hướng dẫn

Tôi đã viết biểu đồ của riêng mình và các lớp BFS và chúng hoạt động tốt. Với họ, tôi có các phương pháp như getParents()getChildren().

Bây giờ tôi đang cố gắng tìm 'đảo' trong biểu đồ này; đó là để nói, tôi đang cố gắng để tìm thấy những phần của codebase của chúng tôi không phụ thuộc vào nhau, với hy vọng thu thập chúng thành các mô-đun bị cô lập.

Sau đó, tôi cũng có kế hoạch phân tích các hòn đảo riêng lẻ để xem có điểm yếu nào trong đó chúng ta có thể thiết lập hàng rào mô-đun và xác định giao diện của mô-đun hay không.

Ngay bây giờ, tôi đang nghĩ đến việc làm điều này:

Map<DependencyEntry, Set<DependencyEntry>> allChildren = new ...; 
for(DependencyEntry entry : allFiles) allChildren.put(entry,getAllChildren(entry)); 
Set<DependencyEntry> visited = new ...; 
Set<DependencyEntry> largest = new HashSet<DependencyEntry>(); // size 0 
// slightly more expensive but more readable 
for(DependencyEntry entry : allChildren.keySet()) { 
    Set<DependencyEntry> set = allChildren.get(key); 
    if(set.size() > largest.size()) largest = set; 
} 
visited.addAll(largest); 

này nên cung cấp cho tôi những hòn đảo lớn nhất. Từ đó, tôi có thể đi qua và loại trừ bất kỳ bộ nào chứa bất kỳ nút đã truy cập nào và sau đó chạy lại để có được hòn đảo lớn nhất tiếp theo, v.v.

Đây có phải là thuật toán chính xác không? Có cách nào tốt hơn để giải quyết vấn đề này mà tôi không thấy?

+0

câu hỏi thú vị thấy đấy, làm mới thay đổi so với làm cách nào để làm XX trong ngôn ngữ YY hoặc giúp với mã lỗi 0x34 câu hỏi! – GBa

Trả lời

2

Có vẻ như bạn muốn xây dựng một bộ sưu tập gồm connected components được tìm thấy trong biểu đồ phụ thuộc. Từ đó bạn có thể lặp lại bộ sưu tập và xác định thành phần lớn nhất (hoặc bất kỳ số liệu thú vị nào khác).

1

nó sẽ đơn giản hơn để sử dụng thư viện biểu đồ, vì những thứ này được tích hợp sẵn. thông thường chúng cho phép bạn lưu trữ thông tin tùy ý trong các nút, cạnh, vì vậy bạn vẫn có thể sử dụng các lớp của riêng bạn cho dữ liệu, nhưng thư viện cung cấp các thuật toán hỗ trợ và tiêu chuẩn.

thuật toán như bạn mô tả có vẻ như không rõ ràng về các nút gốc. nếu bạn không bắt đầu ở gốc thì bạn sẽ không tìm thấy "toàn bộ hòn đảo" - chỉ là các phần bên dưới (trẻ em) nơi bạn bắt đầu. bạn có thể sửa lỗi này bằng cách theo dõi cha mẹ cũng như trẻ em. ngoài ra, nó có vẻ ok - nó đang làm như câu trả lời của PaulF nói, theo như tôi có thể nói, và tìm kiếm các thành phần kết nối.

cũng Good Java graph algorithm library?