Как Keqiang Li commented, вам необходимо определить механизм копирования единой структуры данных графа, который у вас уже есть. Однако, поскольку вам, очевидно, необходимо сначала построить структуру, прежде чем создавать несколько ее копий, обычно используется трюк builder pattern, чтобы создать неизменяемые объекты, на которых вы действительно будете выполнять поиск. Обратите внимание, что это не должно быть реализовано в фактическом отдельном, например, GraphBuilder
класс, а вы можете просто реализовать механизм для создания неизменные копий одной изменчивой структуры графа, который вы изначально строить постепенно, читая в ваших данных:
public class MutableDirectedGraph implements DirectedGraph {
public MutableDirectedGraph() {
...
}
public Edge addEdge(final Node start, final Node end, final String label, final double weight) {
...
}
public Node addNode() {
...
}
...
}
public class ImmutableDirectedGraph implements DirectedGraph {
public ImmutableDirectedGraph(final DirectedGraph copyee) {
...
}
...
}
Одна хорошая вещь об этом подходе является то, что вы можете реализовать MutableDirectedGraph
легко модифицировать/строить инкрементным образом, а затем реализовать ImmutableDirectedGraph
с оптимизацией для поиска (например, хранение Edge
объектов по их идентификаторам в массиве для хранения с высокой эффективностью хранения при использовании хранилища Map
в изменяемой версии). Таким образом, создание двух отдельных классов для двух конкретных задач может быть быстрее для программиста, а также для компьютера.
просто предоставьте правильный метод копирования для своего графика и позвольте другим потокам работать с скопированным графиком. –
Как определить разные вызовы, на которых они должны работать? Это зависит от того, какая нить работает. – Reyny
Можете ли вы предоставить короткий код? Я не уверен, что вы пытаетесь сделать. –