我总是搞不清楚是使用堆栈还是队列来进行 DFS 或 BFS。有人可以提供一些关于如何记住哪种算法使用哪种数据结构的直觉吗?
队列通常可以被认为是结构中的水平,即宽度/宽度可以归因于它 - BFS,而
Stack 可视化为垂直结构,因此具有深度 - DFS。
在一张纸上画一个小图,并思考每个实现中处理节点的顺序。搜索之间遇到节点的顺序和处理节点的顺序有何不同?
其中一个使用堆栈(深度优先),另一个使用队列(广度优先)(至少对于非递归实现)。
我通过将烧烤牢记在心来记住它。烧烤以“B”开始,以“q”这样的声音结束,因此 BFS -> 队列,其余的 DFS -> 堆栈。
BFS 首先探索/处理最近的顶点,然后向外移动远离源。鉴于此,您希望使用一种数据结构,在查询时根据插入的顺序为您提供最旧的元素。在这种情况下您需要队列,因为它是先进先出(FIFO)的。 而 DFS 首先沿着每个分支探索尽可能远的距离,然后再进行分支探索。为此,堆栈效果更好,因为它是 LIFO(后进先出)
按字母顺序排列...
....B(BFS).....C...D(DFS)....
...Q(队列)...R...S(堆栈)...
BFS使用always队列,Dfs使用Stack数据结构。正如前面关于 DFS 的解释所说,它使用回溯。请记住,回溯只能通过堆栈进行。
BFS --> B --> 烧烤 --> 队列
DFS --> S --> 堆栈
什么都不记得了。
假设用于搜索的数据结构是X:
广度优先=较早进入X的节点,必须首先在树上生成:X是一个队列。
深度优先=稍后进入X的节点,必须首先在树上生成:X是一个堆栈。
简单来说:栈就是后进先出,也就是DFS。队列是先进先出的,也就是BFS。
Bfs;宽度=>队列
Dfs;深度=>堆栈
参考它们的结构
深度优先搜索使用
Stack
来记住当到达死胡同时应该去哪里。
DFSS
堆栈(后进先出,LIFO)。对于DFS,我们尽可能从根节点检索到最远的节点,这与LIFO是相同的想法。
队列(先进先出,FIFO)。对于BFS,我们一层一层地检索,访问完上层节点后,再访问下层节点,这和FIFO的思路是一样的。
更容易记住的方法,特别是对于年轻学生来说,是使用类似的缩写:
BFS => 男朋友在队列中(显然是针对受欢迎的女士)。
DFS 否则(堆栈)。
如果您目视将“q”符号(如queue中的)旋转180度,您将得到“b”(如bfs中的)。
否则这就是堆栈和 dfs。
我想分享这个答案: https://stackoverflow.com/a/20429574/3221630
采用BFS并用堆栈代替队列,重现DFS相同的访问顺序,它比实际的DFS算法使用更多的空间。
你可以通过缩写来记住
BQDS
美丽的女王犯下了罪孽。
在印地语中, बहुरानीक्युदर्दसहा
这是一个需要记住的简单类比。在 BFS 中,您一次只能进入一层,但在 DFS 中,您会在访问其他层之前尽可能向左深入。基本上就是堆积一大堆东西,然后一个一个的分析,所以如果这是STACK,那么另一个就是队列。
记住“堆积”、“堆积”,尽可能大。 (DFS)。
我知道这已经很旧了,但人们自 2015 年以来就一直在发帖,所以我会投入我的两分钱:)
Stack = 一堆煎饼。一堆煎饼掉了下来。很深。深度优先。
Queue = 队列是(人的)一条线。线路变宽。广度优先。