我怎么能记住DFS和BFS使用哪些数据结构?

时间:2010-10-14 00:18:53

标签: stack queue depth-first-search breadth-first-search

我总是混淆我是使用堆栈还是DFS或BFS的队列。有人可以提供一些关于如何记住哪种算法使用哪种数据结构的直觉?

15 个答案:

答案 0 :(得分:62)

队列在结构中通常被视为水平,即广度/宽度可归因于它 - BFS ,而

堆栈可视化为垂直结构,因此深度 - DFS

答案 1 :(得分:26)

BFS首先探索/处理最近的顶点,然后向外移动远离源。鉴于此,您希望使用一种数据结构,在查询时根据插入的顺序为您提供最旧的元素。在这种情况下,您需要一个队列,因为它是先进先出(FIFO)。 尽管DFS首先在每个分支上尽可能地进行探索,然后进行包围。为此,堆栈效果更好,因为它是LIFO(后进先出)

答案 2 :(得分:24)

我记得将烧烤放在脑海里。烧烤以'B'开头,并以'q'之类的声音结束,因此BFS - >队列和其余的DFS - >叠加。

答案 3 :(得分:23)

在一张纸上绘制一个小图,并考虑每个实现中处理节点的顺序。在搜索之间,您遇到节点的顺序和处理节点的顺序有何不同?

其中一个使用堆栈(深度优先),另一个使用队列(广度优先)(至少用于非递归实现)。

答案 4 :(得分:6)

按字母顺序排列......

.... B(BFS)..... C ...... D(DFS)......

.... Q(队列)...... R ...... S(堆叠)......

答案 5 :(得分:5)

BFS使用always queue,Dfs使用Stack数据结构。正如之前的解释所说,DFS正在使用回溯。记住回溯只能通过Stack进行。

答案 6 :(得分:2)

  

BFS;宽度=>队列

     

的DFS;深度=>堆

参考他们的结构

答案 7 :(得分:2)

深度优先搜索使用Stack来记住它到达死胡同时应该去的位置。

  

DFSS

答案 8 :(得分:1)

  1. 堆叠(后进先出,LIFO)。对于DFS,我们尽可能地将其从根节点检索到最远的节点,这与LIFO的想法相同。

  2. 队列(先进先出,FIFO)。对于BFS,我们一级一级地检索它,在我们访问节点的上层之后,我们访问节点的底层,这与FIFO的想法相同。

答案 9 :(得分:1)

更容易记住的方法,尤其是对于年轻学生来说,是使用类似的首字母缩略词:

BFS =>排队的男朋友(显然是受欢迎的女士)。

否则DFS(堆栈)。

答案 10 :(得分:1)

什么都不记得了。

假设用于搜索的数据结构为 X

宽度优先 =早先输入 X 的节点,必须首先在树上生成: X是一个队列。< / strong>

深度优先 =稍后输入 X 的节点,必须首先在树上生成: X是堆栈。

简而言之:堆栈是后进先出,即DFS。队列是先进先出,即BFS。

答案 11 :(得分:0)

我想分享这个答案: https://stackoverflow.com/a/20429574/3221630

使用BFS并用堆栈替换队列,重现相同的DFS访问顺序,它使用的空间比实际的DFS算法更多。

答案 12 :(得分:0)

您可以记住首字母缩写

BQDS

美丽的女王犯了罪。

在印地语中, हुरानीक्यु र्दहा

答案 13 :(得分:0)

这里有一个简单的比喻要记住。在BFS中,您一次要移至一个级别,而在DFS中,您要先移至最左侧,然后再访问其他位置。基本上是堆叠一大堆东西,然后逐个分析它们,因此,如果这是堆栈,则另一个是队列。

记住为“堆积”,“堆积”,尽可能大。 (DFS)。

答案 14 :(得分:0)

BFS-> B->烧烤-> 队列

DFS-> S->堆栈