Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我应该使用广度优先还是深度优先来搜索文件系统中预定数量的错误?_Algorithm_Depth First Search_Breadth First Search - Fatal编程技术网

Algorithm 我应该使用广度优先还是深度优先来搜索文件系统中预定数量的错误?

Algorithm 我应该使用广度优先还是深度优先来搜索文件系统中预定数量的错误?,algorithm,depth-first-search,breadth-first-search,Algorithm,Depth First Search,Breadth First Search,我有一个很大的文件系统,需要遍历它以查找错误。每个文件都知道它是否包含错误,所以我只需要访问每个节点并检查那里是否有错误。此外,每个目录都知道其中存在的错误总数,因此一旦找到给定数量的错误,就可以终止搜索,如果目录不包含错误,则不需要遍历该目录 我的问题是,更好的解决方案是使用深度优先还是广度优先搜索。树的高度是未定义的,我知道这通常会使BFS更好,但鉴于我们知道在遍历目录之前是否会包含错误,我不确定这一优势是否会减弱 注意:这不是家庭作业。这是老板要求我写的剧本的要求 编辑1:时间效率比空间效

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

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

注意:这不是家庭作业。这是老板要求我写的剧本的要求

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


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

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


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

这取决于一些内容

  • 您的目录是否可以包含链接,您是否可以遍历这些链接?在这种情况下,链接是否可能形成循环?在这种情况下,如果要忽略循环检查,BFS更有意义。否则,这没什么区别

  • 错误的分布情况如何?可能是一个目录包含的错误最多,而其他目录几乎没有错误吗?在这种情况下,BFS更有可能更快结束,因为它会一点一点地搜索所有目录。在这种情况下,您将花费很长时间在一个巨大的目录树中使用DFS,该目录树的最底部的叶子中包含一个错误,但却发现下一个目录包含了级别1所需的所有错误。如果错误分布更均匀,那么使用什么也无所谓

  • 你的建筑有多大?如果您有一个分支因子为n(每个目录有n个子目录)的树,并且该树的深度为d,那么BFS可以占用
    O(d^n)
    内存,而DFS的写入方式可以是只占用
    O(d)
    内存(或者在更简单的实现中
    O(d*n)
    )这在真正巨大的目录中可能会产生不同


阅读您的问题时,我的总体感觉是BFS,但仍然是您必须根据问题的属性做出决定。

如果目录或文件系统结构的宽度大于深度,则DFS,否则,BFS用于内存约束:

另外,如果您要查找的文件是用户生成的,那么它应该位于相对靠近根的位置,因此BFS

如果存在未正确处理的符号链接或网络驱动器,并可能导致循环,请使用DFS进行循环检测


在真实场景中,深度有限的DFS调整其深度限制,模仿BFS的完整性,同时保留其空间效率特性。它只跟踪其当前路径。

每个目录是否知道其所有子目录或直接目录中有多少错误?你需要注意错误是什么(即找到每个有错误的文件)还是只需要注意这些错误在哪个子树中?他说,如果一个目录不包含错误,就不需要遍历它,这意味着它们知道所有的子目录。如果你知道所有的子目录,那么深入一层有什么意义?也就是说,没有必要进行深度优先搜索。我需要每个包含错误的文件都有一个完整的文件路径,这就是为什么我需要尽可能深入地访问该文件的原因。是的,每个目录都知道所有子目录的错误。大大提高了缓存性能。对于许多这样说的帖子,请阅读以下内容:我认为您可能使用了术语“缓存”而不是“引用的位置”来进行查找和垃圾收集?e、 我使用缓存作为引用的简写,这就是为什么引用的位置很重要。这里没有任何东西与垃圾收集有任何关系,我不知道你为什么会提出这个问题。“切尼的算法是一种在计算机软件系统中跟踪垃圾收集的停止复制方法……这被称为广度优先列表复制垃圾收集方案。”至于第2点,他说,每个目录都知道所有子目录中的错误总数,因此跳过是微不足道的。具有分支因子
n
的树将导致BFS占用
O(n^d)
,但事实证明,这在实践中非常罕见,特别是因为它只有在所有错误都在叶子上时才会这样做。@MooingDuck,好的,我将修正第二点,这样它将表明推理仍然是相同的,因为BFS占用了很多空间,我只是指出了差异。这取决于他决定他的目录是否满足这些条件。关于#3:如果我每个目录有10个子目录,