2011-08-25 77 views
6

我正在使用一種模糊的語言,並且依賴性管理很差。爲了幫助14000個文件代碼庫,我編寫了一些解析工具(使用Java)並生成了一個依賴關係圖。在有向圖中查找島嶼

我寫了自己的圖和BFS類,他們工作得很好。有了它們,我有了getParents()getChildren()這樣的方法。

現在我試圖找到這個圖中的'島'也就是說,我試圖找到我們的代碼庫的哪些部分不相互依賴,希望將它們收集到獨立的模塊中。

後來,我還計劃分析各個島嶼,看他們是否有任何薄弱環節,我們可以建立模塊障礙並定義模塊的界面,但這是不可能的。

現在,我想這樣做的:

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); 

這應該給我最大的島嶼。從那裏,我可以通過並排除任何包含任何訪問節點的集合,然後再次運行它以獲得下一個最大的島,依此類推。

這是一個準確的算法嗎?有沒有更好的方法來解決我沒有看到的問題?

+0

有趣的問題看,從清爽改變我該怎麼做XX在YY語言或錯誤代碼幫助0x34的問題! – GBa

回答

2

聽起來就像你想要建立在依賴關係圖中找到的connected components的集合。從那裏你可以迭代集合並確定最大的組件(或任何其他有趣的度量)。

1

使用圖庫會更簡單,因爲這些東西都是內置的。通常它們允許您在節點,邊緣存儲任意信息,因此您仍可以使用自己的類來處理數據,但該庫提供支持和標準算法。

你所描述的算法似乎有點不清楚什麼是根節點。如果你不從根開始,那麼你將找不到「整個島嶼」 - 只是你開始的下面的部分(孩子)。你可以通過跟隨父母以及孩子來解決這個問題。除此之外,它聽起來沒問題 - 就像PaulF的答案所說的那樣,據我所知,找到了連接的組件。

Good Java graph algorithm library?