我总是混淆我是使用堆栈还是DFS或BFS的队列。有人可以提供一些关于如何记住哪种算法使用哪种数据结构的直觉?
答案 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)
堆叠(后进先出,LIFO)。对于DFS,我们尽可能地将其从根节点检索到最远的节点,这与LIFO的想法相同。
队列(先进先出,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->堆栈