我最近被告知BFS& DFS并被要求在DFS中实现一些东西:列出/搜索文件名的目录。我能够把它拉下来(总的来说,我确实得到了如何继续进行的暗示),但是从那时起我就被BFS所吸引,而且我甚至无法掌握如何在同样的问题。
根据我在维基百科上发现的图表和几个谷歌搜索,这是我到目前为止最接近的事情:
守则:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.File;
public class foo {
private List<List<String>> queue = new ArrayList<List<String>>();
/**
* @param args
*/
public static void main(String[] args) throws Exception {
foo f = new foo();
f.traverse("src");
f.report();
}
public void traverse(String dir) throws Exception {
// add dir to the top of the tree
queue.add(0, Arrays.asList(dir));
traverse(dir, 1);
}
public void traverse(String dir, int depth) throws Exception {
// add a new depth if this is a new one
if (queue.size() <= depth) {
queue.add(new ArrayList<String>());
}
File file = new File(dir);
for (File curfile: file.listFiles()) {
queue.get(depth).add(curfile.getPath());
// recursive function call if curfile is a directory
if (curfile.isDirectory()) traverse(curfile.getPath(), depth+1);
}
}
public void report() {
for (int i=0; i<queue.size()-1; i++) {
log(String.format("****** Level %d ******", i));
for (String node : queue.get(i))
log(String.format("[%d] `%s'", i, node));
}
}
public void log(String s) {
System.out.printf("[foo] %s\n", s);
}
}
输出:
[foo] ****** Level 0 ******
[foo] [0] 'src'
[foo] ****** Level 1 ******
[foo] [1] 'src/A'
[foo] [1] 'src/C'
[foo] [1] 'src/foo.java'
[foo] [1] 'src/B'
[foo] ****** Level 2 ******
[foo] [2] 'src/A/A2'
[foo] [2] 'src/A/A1'
[foo] [2] 'src/C/C1'
[foo] ****** Level 3 ******
[foo] [3] 'src/A/A2/A2A'
[foo] [3] 'src/A/A1/A1A'
[foo] [3] 'src/C/C1/C1A'
[foo] [3] 'src/C/C1/C1B'
[foo] ****** Level 4 ******
[foo] [4] 'src/A/A2/A2A/A2A1'
[foo] [4] 'src/C/C1/C1A/C1A1'
[foo] ****** Level 5 ******
[foo] [5] 'src/A/A2/A2A/A2A1/A2A1A'
[foo] ****** Level 6 ******
[foo] [6] 'src/A/A2/A2A/A2A1/A2A1A/A2A1A1'
[foo] [6] 'src/A/A2/A2A/A2A1/A2A1A/A2A1A2'
我知道这不可能是正确的,因为虽然它吐出看似正确的输出,但我知道内部工作是错误的。它本质上是一个伪装成BFS的DFS,使用ArrayList来隐藏证据。
迫切希望有人可以帮助我在这里关闭,因为自从我开始拖延尝试理解这个概念以来,我已经有一个框架书在我的桌面上烧了近一个月了。因此,埋没在大量的漫游中,我的问题是:BFS如何应用于目录结构?此外,BFS / DFS实施例的“For-Dummies”版本是否可以在线或在任何地方打印出来?
答案 0 :(得分:0)
BFS如何应用于目录结构? BFS和DFS概念都是关于树数据结构的(目录也可以是树)。假设您了解树深度,BFS基本上按照从最低深度到最大深度的顺序访问所有节点。堆栈是DFS,因为队列是BFS。
我不确定是否有&#34; for-dummies&#34;实现。我认为这个概念就像我解释的一样简单。维基百科应提供缺失的信息。
您对自己的实施有什么疑问?就像我说的,DFS和BFS之间唯一的区别就是使用Stack或Queue。