#java #algorithm #graph #iterator
#java #алгоритм #График #итератор
Вопрос:
Я пытался упростить, DFS
используя объектно-ориентированный дизайн и реализуя Iterator
класс. Но DFS
работает не так, как должно.
Я почти перепробовал все, что мог, но мне не удалось заставить это работать.
Также я не смог найти много соответствующей информации в Интернете о типе кода, который я пытаюсь.
У меня есть два интерфейса Vertex
и Graph
.
Ниже приведен код, который я пытаюсь:
public class GraphIterator implements Iterator<Vertex> {
private Graph g;
private Vertex v;
private Stack<Vertex> stack;
private Set<Vertex> colored;
public GraphIterator(Graph g, Vertex v) {
this.g = g;
this.v = v;
stack = new Stack<>();
colored = new TreeSet<>();
stack.push(v);
colored.add(v);
}
@Override
public boolean hasNext() {
return stack.isEmpty();
}
@Override
public Vertex next() {
Vertex u = stack.pop();
for(Vertex vertex : g.getNeighbours(u)) {
if(vertex != null amp;amp; !colored.contains(vertex))
stack.add(vertex);
}
return stack.pop();
}
}
Это код, в main()
котором я пытаюсь протестировать:
GraphClass g = new GraphClass();
Vertex v = new VertexClass(0);
Vertex w = new VertexClass(1);
g.addVertex(v);
g.addVertex(w);
g.addEdge(v, w);
Iterator<Vertex> it = new GraphIterator(g, v);
System.out.println(v " vs " it.next());
System.out.println(it.hasNext());
System.out.println(w " vs " it.next());
Я знаю, что делаю что-то не так с DFS
алгоритмом, но я не могу до конца понять, что и где я делаю не так?
Я в основном уверен, что я делаю что-то не так с DFS
алгоритмом, который необходимо реализовать с использованием переопределенных методов из Iterator
класса. Я также был бы признателен за несколько советов о том, как это сделать.
Я был бы признателен, если бы кто-нибудь мог помочь мне в этом алгоритме.
Комментарии:
1. Можете ли вы показать модульный тест? Как выглядит график?
2. @cricket_007 На данный момент у меня нет модульных тестов, это просто неориентированный простой граф с вершинами
3. Хорошо, тогда вы можете показать пример ввода графика?
4. Вы реализовали equals и hashcode в классе реализации vertex? В противном случае метод set contains не будет работать
5. Предоставление полного выполняемого / тестируемого кода было бы намного проще как для вас, так и для других, чтобы помочь в решении вопроса, а тестовый пример сделал бы все более понятным и простым.
Ответ №1:
Возможные улучшения рассматриваемого кода:
- В
next()
, может быть, простоreturn u;
, вместоreturn stack.pop();
.
Потому что это привело бы к появлению 2 элементов за один вызовnext()
, а соседние вершины второго не были отмечены. LinkedList
может быть лучшим выбором, чемStack
здесь.
Поскольку, похоже, нет необходимости в параллельном управлении.
Кстати:
LinkedList
это тоже стек, он не потокобезопасен; в то время какStack
потокобезопасен.- (Если бы можно было опубликовать код в блоке, который другие могут копировать и запускать напрямую, и видеть результат, тогда, вероятно, можно было бы предоставить лучший ответ.)