我寫的,其計算和存儲DAG的所有路徑的算法,它很好地工作在小圖 - 但現在我希望提高它的效率,在更大的圖形運行。該算法的核心邏輯在下面的createSF()和makePathList()中,其他方法是助手 - 我可以看到append是一個瓶頸。不過,我想最大的幫助是設計一個可以將路徑存儲在字典中的數據結構,因爲許多路徑都是由其他路徑組成的,這是我的問題的關鍵。圖算法 - 展望提高可伸縮性
private Multiset<String> paths = new Multiset<String>();
public Multiset<String> createSF(DAGNode n) {
for (DAGNode succ : n.getSuccessors())
createSF(succ);
if (!n.isVisited())
for (String s : makePathList(n))
paths.put(s);
n.setVisited(true);
return paths;
}
private List<String> makePathList(DAGNode n) {
List<String> list = new ArrayList<String>();
list.add(n.getLabel());
for (DAGNode node : n.getSuccessors())
list.addAll(append(n.getLabel(), makePathList(node)));
return list;
}
private List<String> append(String s, List<String> src) {
List<String> ls = new ArrayList<String>();
for (String str : src)
ls.add(s + "/" + str);
return ls;
}
編輯:
我現在正在使用的路徑對象來表示路徑和具有針指向的瓶頸這兩種方法:
public List<Path> createPathList(Tree n) {
List<Path> list = new ArrayList<Path>();
list.add(new Path(n.getNodeName()));
for (Tree node : n.getSuccessors()) {
list.addAll(append(n.getNodeName(), createPathList(node)));
}
return list;
}
public List<Path> append(String s, List<Path> src) {
List<Path> ls = new ArrayList<Path>();
for (Path path : src) {
ls.add(new Path(path, s));
}
return ls;
}
麻煩的是當的曲線圖是大小M這些方法將被稱爲M次,這意味着這裏創建了很多列表......是否有一種更有效的方法來構建createPathList()的返回值?
您期望如何處理您的路徑?爲什麼你將每一個存儲爲列表? – Anna 2009-09-07 10:09:16