我对dfs的理解是使用堆栈(使用队列的bfs)。但是,如果我想遍历dfs中的矩阵。我怎么想这样做?
假设我有一个矩阵,我想找到一条从左上角到右下角的路径,它只能向下和向右移动。
public void dfsHelper(int[][] matrix, int i, int j ){
if (i >= row || j >= col) return;
if (i == row - 1 && j == col - 1) {
return;
}
dfsHelper(matrix, min, i, j + 1);
dfsHelper(matrix, min, i + 1, j);
}
}
上面是一个在线版本的dfs矩阵,我只能看到它作为一个递归,为什么它是一个dfs?
答案 0 :(得分:2)
在查看3x3矩阵(例如)时是否有帮助:
00 01 02
10 11 12
20 21 22
00
/ |
01 10
| | \
02 11 20
| |
12 22
答案 1 :(得分:1)
DFS
和BFS
是两种遍历图形或矩阵的方法。
现在回答你的问题。您正在使用recursive
函数(stack
内部执行的功能相同),DFS
只是在回溯之前越来越深入,同时在任何周期的情况下保持访问的顶点数组。你的方法完全一样。
Recursive
实施DFS
1 procedure DFS(G,v):
2 label v as discovered
3 for all edges from v to w in G.adjacentEdges(v) do
4 if vertex w is not labeled as discovered then
5 recursively call DFS(G,w)
Iterative
实施
1 procedure DFS-iterative(G,v):
2 let S be a stack
3 S.push(v)
4 while S is not empty
5 v = S.pop()
6 if v is not labeled as discovered:
7 label v as discovered
8 for all edges from v to w in G.adjacentEdges(v) do
9 S.push(w)
伪代码来源是维基百科DFS
答案 2 :(得分:1)
深度优先搜索是一种主要用于树或图遍历的算法。使算法成为深度优先搜索的原因是它在回溯之前一直在分支中搜索。
您首先发布的算法会查看当前元素,然后在右侧和下方子级上递归调用自身。该算法将在向后追溯到向下分支(i + 1,j)上运行之前完全探索右分支(在本例中为i,j + 1)。
如果你仍然对DFS感到困惑,我会首先尝试阅读Depth-First Search Wikipedia page以更好地理解算法的全部内容
答案 3 :(得分:0)
深度优先搜索(DFS
)和广度优先搜索(BFS
)是两种不同的遍历图形的样式。深度优先遍历子节点的单个路径,直到它到达特定分支或路径的最终节点。广度优先通过在遍历图表之前检查来自根节点的特定深度的所有节点来遍历。
考虑这个例子,00是根节点:
00
/ | \
01 11 21
| | |
02 12 22
| | |
03 13 23
深度优先遍历顺序:00,01,02,03,11,12,13,21,22,23
广度优先遍历顺序:00,01,11,21,02,12,22,03,13,23
您可以使用iteration
,recursion
或两者来实施DFS
或BFS
算法,这是决定您是否使用DFS
的唯一因素或BFS
是您检查节点的顺序。DFS
由于实施的简单性,算法往往倾向于recursion
,但recursion
不保证DFS
1}}和DFS
不保证recursion
,这是一个实现细节。
答案 4 :(得分:-3)
DFS和BFS是图遍历算法,不用于遍历矩阵。图形可以以邻接矩阵的形式表示,并且如果算法谈论使用DFS遍历邻接矩阵,则实际上意味着它正在对图形或矩阵表示的树这样做。 Here是Java中的一个例子。