通过DFS进行的图形迭代器有什么问题?

时间:2019-04-08 05:20:43

标签: java algorithm graph iterator

我一直在尝试使用面向对象的设计并通过实现DFS类来简化Iterator。但是DFS不能正常工作。

我几乎已经尝试了所有可能的方法,但是我无法完成这项工作。

我也找不到关于我正在尝试的代码类型的很多相关信息。

我有两个接口VertexGraph

以下是我正在尝试的代码:

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 && !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 个答案:

答案 0 :(得分:1)

可能对相关代码进行了改进:

  • next()中,可能只是return u;,而不是return stack.pop();
    因为那样会在一次调用next()中弹出2个元素,并且未选中第二个元素的相邻顶点。
  • LinkedList比这里的Stack更好。
    由于似乎不需要并发控制。

顺便说一句:

  • LinkedList也是 stack ,它不是线程安全的;而Stack是线程安全的。
  • (如果可以将代码发布在一个块中,让其他人可以直接复制并运行该代码,然后查看输出,则可能会提供更好的答案。)