Я написал алгоритм, который вычисляет и сохраняет все пути 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;
}
EDIT:
Я сейчас, используя объект пути для представления пути и иметь пин-указал горлышко бутылки к этим двум методам:
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