我应该先使用广度优先或深度优先搜索文件系统以获得预定数量的错误吗?

时间:2011-11-07 21:49:13

标签: algorithm depth-first-search breadth-first-search

我有一个大型文件系统,我需要遍历错误。每个文件都知道它是否包含错误,因此我只需要前往每个节点并检查是否存在错误。此外,每个目录都知道其中存在的错误总数,因此一旦找到给定数量的错误就可以终止搜索,如果不包含错误,则不需要遍历目录。

我的问题是,更好的解决方案是使用深度优先搜索还是广度优先搜索。树的高度是未定义的,我知道通常会使BFS更好,但鉴于我们知道目录在遍历之前是否会包含错误,我不确定是否可以减轻这种优势。

注意:这是 NOT 作业。这是我老板要求我写的脚本的要求。

编辑1:时间效率远比空间效率重要,因为脚本主要在一夜之间运行,因此如果需要,它基本上可以使用所有系统内存。

编辑2:虽然看起来流行的答案是我的问题的BFS,但我很难理解为什么它不会是DFS问题。由于(A)最终需要达到所有错误,并且(B)我们知道目录是否包含错误,因此BFS对兔子洞的保护并不真正适用。考虑到这一点,唯一真正的差异似乎是使用空间,这将使DFS更好。谁能给出一个很好的论据,为什么不是这种情况呢?

3 个答案:

答案 0 :(得分:2)

根据要求,我建议使用广度优先搜索,这对于基于节点的结构来说通常更快,而且(我很确定)这种情况也是如此。

由于提高了缓存性能,基于节点的结构的广度优先搜索更快,即使它必须维护“待办事项”列表。这使得广度优先于目录搜索的建议。由于您的算法是一种搜索算法,我会在这里提出一般性建议。

答案 1 :(得分:1)

这取决于一些东西。

  • 您的目录是否包含链接,您是否会遍历链接?在这种情况下,链接是否可以进行循环?在这种情况下,如果您想忽略循环检查,BFS会更有意义。否则,没有区别。

  • 错误的分布如何?可能是一个目录包含大多数错误,而其他目录几乎没有错误?在这种情况下,BFS更有可能更快结束,因为它一点一点地搜索所有目录。在这种情况下,你会花费很长时间在一个巨大的目录树中使用DFS,在最底层只包含1个错误,只是为了找出包含你在1级需要的所有错误的下一个目录。如果错误是再分配得更均匀,无论你使用什么都没关系。

  • 你的结构有多大?如果你有一个具有分支因子n的树(每个目录有n个子目录)并且树具有深度d,则BFS可以采用O(d^n)内存,而DFS可以以仅需{{1}的方式编写内存(或更简单的实现O(d)),在真正庞大的目录中可能会产生影响。

我对阅读你的问题的一般感觉是BFS,但你仍然必须根据问题的属性来决定。

答案 2 :(得分:0)

如果目录或文件系统结构的宽度大于深度,则为DFS,否则为内存约束为BFS: https://stackoverflow.com/a/23478084/986067

If the depth (or height) is unknown and potentially infinite, DFS (preorder) will never complete the search, while BFS will.

如果您要查找的文件是用户生成的,那么它应该位于离根目录相对较近的位置,即BFS。

如果符号链接或网络驱动器处理不当并可能导致循环,请使用DFS进行循环检测。

在现实世界中? Iterative Deepening DFS,受深度限制的DFS调整其深度限制,在保持其空间效率特征的同时模仿BFS的完整性。它仅跟踪其当前路径。