Data structures 为什么使用广度优先搜索时内存是主要限制因素

Data structures 为什么使用广度优先搜索时内存是主要限制因素,data-structures,depth-first-search,breadth-first-search,Data Structures,Depth First Search,Breadth First Search,我正在阅读BFS和DFS,我了解BFS使用队列存储节点,而DFS使用堆栈存储尚未访问的节点。但是当我分析这些差异时,我发现很多网站都提到广度优先搜索需要更多的内存,因为它需要队列来存储节点。我不明白为什么BFS只需要更多的内存,因为即使是DFS也在使用堆栈来维护节点。有人能告诉我我是否遗漏了什么吗?好吧,首先,平衡的树往往比高的树宽。这是因为每次向平衡树添加深度级别时,其容量大约会翻倍 因此,对于存储16383个项目,树底部的宽度是8192,但深度只有14: Level 1: 1

我正在阅读BFS和DFS,我了解BFS使用队列存储节点,而DFS使用堆栈存储尚未访问的节点。但是当我分析这些差异时,我发现很多网站都提到广度优先搜索需要更多的内存,因为它需要队列来存储节点。我不明白为什么BFS只需要更多的内存,因为即使是DFS也在使用堆栈来维护节点。有人能告诉我我是否遗漏了什么吗?

好吧,首先,平衡的树往往比高的树宽。这是因为每次向平衡树添加深度级别时,其容量大约会翻倍

因此,对于存储16383个项目,树底部的宽度是8192,但深度只有14:

Level  1: 1
       2: 2-3         
       3: 4-7
       4: 8-15
       5: 16-31
       6: 32-63
       7: 64-127
       8: 128-255
       9: 256-511
      10: 512-1023
      11: 1024-2047
      12: 2048-4095
      13: 4096-8191
      14: 8192-16383

嗯,首先,平衡的树往往比它们高的更宽。这是因为每次向平衡树添加深度级别时,其容量大约会翻倍

因此,对于存储16383个项目,树底部的宽度是8192,但深度只有14:

Level  1: 1
       2: 2-3         
       3: 4-7
       4: 8-15
       5: 16-31
       6: 32-63
       7: 64-127
       8: 128-255
       9: 256-511
      10: 512-1023
      11: 1024-2047
      12: 2048-4095
      13: 4096-8191
      14: 8192-16383

BFS和DFS存储之间的主要区别在于BFS保留它将要访问的节点队列,而DFS堆栈保留它从根节点到当前节点访问的节点(当它完成遍历当前节点的子节点时,它将返回到这些节点)

在最坏的情况下,BFS和DFS都将在队列或堆栈中存储O(N)个节点

就内存使用而言,DFS最糟糕的情况是它将树的几乎所有节点存储在堆栈中,即树看起来像一个链表(除最后一个节点外,每个节点都有一个子节点)。在这种情况下,堆栈中将有N-1个节点

对于BFS,在内存使用方面,最坏的情况是当您的根节点连接到每个其他节点时,在这种情况下,它将在队列中存储N-1个节点-与最坏情况下DFS在堆栈中的存储量相同


但是如果我们考虑平衡树(平均情况),DFS每次只存储从根到当前节点的路径(大约是logn个节点),而BFS将存储队列,对于平衡二叉树,当您到达树的底部时,可以大到N/2。

BFS和DFS存储之间的主要区别是BFS保留它要访问的节点队列,而DFS堆栈保留它从根节点到当前节点访问的节点(当完成遍历当前节点的子节点时,它将返回到这些节点)

在最坏的情况下,BFS和DFS都将在队列或堆栈中存储O(N)个节点

就内存使用而言,DFS最糟糕的情况是它将树的几乎所有节点存储在堆栈中,也就是说,树看起来像一个链表(除最后一个节点外,每个节点都有一个子节点)。在这种情况下,它在堆栈中有N-1个节点

对于BFS,在内存使用方面,最坏的情况是当您的根节点连接到每个其他节点时,在这种情况下,它将在队列中存储N-1个节点-与最坏情况下DFS在堆栈中的存储量相同


但是如果我们考虑平衡树(平均情况),DFS每次只存储从根到当前节点的路径(即日志N节点),而BFS将存储队列,对于平衡的二叉树,当您到达树的底部时,队列可能会大到N/2。

检查这个所以:检查这个所以:当树是一个链表(每个节点只有一个分支)时,BFS和DFS不是只相等吗?对于所有其他情况,DFS使用更少的内存。对于链表,BFS将不使用与DFS相同的内存量。DFS堆栈将包含除到达最后一个节点外的所有节点,而BFS队列每次仅包含一个节点。啊,好的。我正在考虑需要通过串联func值来生成结果的算法tion调用。但根据定义,这就是DFS。当树是一个链表(每个节点只有一个分支)时,BFS和DFS不是只相等吗?对于所有其他情况,DFS使用更少的内存。对于链表,BFS将不使用与DFS相同的内存量。DFS堆栈将包含除到达最后一个节点外的所有节点,而BFS队列每次仅包含一个节点。啊,好的。我正在考虑需要通过串联func值来生成结果的算法但根据定义,这就是DFS。