深度优先搜索DFS

目录

类 `GraphDFS` 的定义

深度优先搜索方法 `dfs`

访问顺序的获取 `order`


深度优先搜索(DFS, Depth-First Search)算法。深度优先搜索是一种用于遍历或搜索树或图的算法,其特点是从某个起始顶点出发,首先访问这个顶点,然后递归地访问与这个顶点直接相连的一个未访问过的顶点,再从这个顶点出发,继续访问它的未访问过的邻接顶点,如此重复,直到不能再深入为止,再回溯,直到所有能到达的顶点都被访问过。下面是对这段代码的逐部分解析:

类 `GraphDFS` 的定义

- 私有变量:
  - `private boolean[] visited`:一个布尔数组,用于记录图中每个顶点是否已被访问过。数组的大小与图顶点的数量相同。
  - `private List order`:一个整数类型的列表,用于记录深度优先搜索过程中顶点的访问顺序。
  - `private MyGraphByTreeSet G`:图对象,这里假设了一个名为 `MyGraphByTreeSet` 的图类,它提供了一些方法来操作图。

- 构造函数:
  - `public GraphDFS(MyGraphByTreeSet G)`:接收一个 `MyGraphByTreeSet` 类型的图对象 G 作为参数。构造函数内初始化了数组 `visited`,并确保图中所有的顶点都被遍历到。这通过一个从 0 到 `G.getV()-1` 的循环实现,其中 `G.getV()` 是图中顶点的总数。对于每个未访问的顶点,将调用 `dfs` 方法进行深度优先搜索。

深度优先搜索方法 `dfs`

- 方法定义:
  - `private void dfs(int v)`:一个私有方法,接收一个整数参数 `v` 作为起始顶点。这个方法不返回任何值,而是通过递归的方式,将所有与 `v` 可以连通的顶点按照深度优先的顺序标记为已访问,并将它们添加到 `order` 列表中。

- 实现细节:
  - 将顶点 `v` 标记为已访问。
  - 将顶点 `v` 加入 `order` 列表,表示已经访问该顶点。
  - 遍历 `v` 的所有邻接顶点 `w`。如果 `w` 没有被访问过,那么递归调用 `dfs(w)`,继续访问 `w` 及其邻接顶点。
  - 这个过程重复,直到不能再深入为止,回溯到上一个顶点,继续访问其他未访问的邻接顶点,直到所有能到达的顶点都被访问过。

访问顺序的获取 `order`

- 方法定义:
  - `public Iterable order()`:一个公共方法,返回一个不可修改的列表,该列表包含深度优先搜索过程中访问顶点的顺序。

- 实现细节:
  - 通过 `Collections.unmodifiableList(order)` 将 `order` 列表转换为一个不可修改的版本,然后返回。这样做可以防止外部代码修改内部的访问顺序列表,保持数据的一致性和安全性。

通过深度优先搜索算法,能够有效地遍历或搜索整个图结构,确保了每个顶点都被访问且访问顺序为深度优先。在实际的应用中,`MyGraphByTreeSet` 需要是一个实现了邻接表或者邻接矩阵的图类,它提供了插入边、获取邻接顶点列表等方法。

完整代码:

public class GraphDFS {

    private boolean[] visited; // 记录顶点是否被访问过
    private List order = new ArrayList<>(); // 记录 DFS 访问顺序
    private MyGraphByTreeSet G; // 图对象

    /**
     * 构造函数,对图 G 进行 DFS 遍历
     * @param G 图对象
     */
    public GraphDFS(MyGraphByTreeSet G) {
        this.G = G;
        visited = new boolean[G.getV()];
        for (int v = 0; v < G.getV(); v++) {
            if (!visited[v]) {
                dfs(v);
            }
        }
    }

    /**
     * 深度优先搜索方法
     * @param v 起始顶点
     */
    private void dfs(int v) {
        visited[v] = true;
        order.add(v); // 记录访问顺序
        for (int w : G.adj(v)) { // 遍历 v 的所有邻接顶点
            if (!visited[w]) {
                dfs(w); // 递归调用
            }
        }
    }

    /**
     * 获取 DFS 访问顺序
     * @return 不可修改的顺序列表
     */
    public Iterable order() {
        return Collections.unmodifiableList(order);
    }

    public static void main(String[] args) {
        // 测试代码
        MyGraphByTreeSet graph = new MyGraphByTreeSet(5, 5);
        graph.insert(0, 1);
        graph.insert(0, 2);
        graph.insert(1, 3);
        graph.insert(2, 4);
        GraphDFS dfs = new GraphDFS(graph);
        System.out.println("DFS Order: " + dfs.order());
    }
}

测试结果:

DFS Order: [0, 1, 3, 2, 4]

你可能感兴趣的:(Java数据结构,算法,数据结构,java)