![]() |
1
19
如果要进行宽度优先搜索,自然实现是将节点推送到队列中,而不是使用递归。 如果您正在进行深度优先搜索,那么递归是编写遍历代码的最自然的方法。但是,除非编译器将尾部递归优化为迭代,否则递归实现将比迭代算法慢,并且将在足够深的树上因堆栈溢出而死亡。 一些快速的python来说明区别:
|
![]() |
2
8
如果您有一个固定的内存专用于堆栈,正如您经常做的那样(这在许多Java JVM配置中尤其是一个问题),如果您有一个深树(或者如果在任何其他场景中递归深度都很高),递归可能无法正常工作;它会导致堆栈溢出。一种迭代方法,将节点推送到队列(对于bfs,如遍历)或堆栈(对于df,如遍历)上,在若干方面具有更好的内存属性,因此如果这很重要,请使用迭代方法。 递归的优点是表达式简单/优雅,而不是性能。记住这是为给定的算法、问题大小和机器体系结构选择适当方法的关键。 |
![]() |
3
1
这取决于您是想进行深度优先遍历还是宽度优先遍历。深度优先是最容易通过递归实现的。在宽度优先的情况下,您需要保留一个节点队列,以便将来扩展。 |
![]() |
4
1
实际上,您应该使用队列进行广度优先搜索,使用堆栈进行深度优先搜索, 从while循环运行您的算法。 如果执行简单的操作,进行递归函数调用可以显著地拖动程序。 遍历时的操作,可能会导致堆栈溢出,但现在 需要努力去看。 只需在边上有一个哈希,以跟踪已经访问的节点,以防它不是 一棵树,但是一个连接良好的图。 |
![]() |
5
-1
使用递归,因为实际上可能会出现堆栈溢出错误,这就是stack overflow.com。 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 6 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 10 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 10 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 11 月前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 11 月前 |