我经常混淆DFS或BFS使用堆栈(stack)还是队列(queue)。请问有人可以提供一些直觉来记住哪种算法使用哪种数据结构吗?
我经常混淆DFS或BFS使用堆栈(stack)还是队列(queue)。请问有人可以提供一些直觉来记住哪种算法使用哪种数据结构吗?
队列(Queue)可以被普遍看作是水平的结构,即可以将其归属于广度优先搜索(BFS),因为它具有宽度/横向。
栈(Stack)被视为垂直的结构,因此具有深度,可以归属于深度优先搜索(DFS)。
在一张纸上画一个小图,思考每种实现中处理节点的顺序。你遇到节点的顺序和处理节点的顺序在不同搜索之间有何区别?
其中一种使用栈(深度优先),另一种使用队列(广度优先)(至少对于非递归实现而言)。
我记得它是通过将烧烤牢记在我的脑海中。 烧烤以“B”开头,以类似于“q”的声音结束,因此BFS->队列,其余的DFS->堆栈。
BFS先探索/处理最近的顶点,然后向外从源点移动。因此,您需要使用一种数据结构,当查询时,该数据结构按照它们被插入的顺序给出最旧的元素。在这种情况下,您需要使用队列,因为它是先进先出(FIFO)的。
而DFS首先沿着每个分支尽可能远地探索,然后回溯。对于这个问题,栈更好,因为它是后进先出(LIFO)的。
按照字母顺序来看……
……B(广度优先搜索)……C……D(深度优先搜索)……
……Q(队列)……R……S(栈)……
BFS --> B --> 烧烤串 --> 队列
DFS --> D --> 栈
不记得任何事情。
假设用于搜索的数据结构为X:
广度优先 = 先进入X的节点必须首先在树上生成:X是队列。
深度优先 = 后进入X的节点必须首先在树上生成:X是堆栈。
简而言之:堆栈是后进先出,即DFS。队列是先进先出,即BFS。
DFSS