自从我在大学里服用

问题描述 投票:0回答:2

如果您要进行广度,则自然实现是将节点推入队列,而不是使用递归。 如果您正在进行深度搜索,那么递归是编码遍历的最自然方法。但是,除非您的编译器优化尾部递归中的迭代,否则您的递归实现将比迭代算法慢,并且会在足够深的树上死亡。 一些快速的python说明了区别:

#A tree is a tuple of an int and a tree. t = (1, (2,(4, (6), (7, (9)) )), (3, (5, (8)) )) def bfs(t): to_visit = [t] while len(to_visit) > 0: c = to_visit[0] if type(c) is int: print c else: print c[0] if len(c) > 1: to_visit.append(c[1]) if len(c) > 2: to_visit.append(c[2]) to_visit = to_visit[1:] def dfs(t): if type(t) is int: print t return print t[0] dfs(t[1]) if len(t) > 2: dfs(t[2]) bfs(t) dfs(t)

algorithm tree
2个回答
20
投票
如果您经常这样做(在许多Java JVM配置中尤其是一个问题),如果您有固定数量的内存,则递归如果您有一棵深树(或者递归深度很高,则递归中的递归都无法正常工作。任何其他场景);它将导致堆栈溢出。 一种迭代方法,推动节点访问队列(类似于BFS的遍历)或堆栈(对于类似于DFS的遍历)具有更好的内存属性,因此,如果这很重要,请使用迭代方法。

递归的优势是表达的简单/优雅,而不是性能。 记住这是为给定算法,问题大小和机器体系结构选择适当方法的关键。

取决于您是要进行深度优先还是广度优先的遍历。深度优先是最容易通过递归实施的。首先,您需要保持一个节点的排队以在将来扩展。

实际上,您应该使用队列进行广度首次搜索和堆叠以进行深度首次搜索,
并从循环中运行您的算法。
如果您做简单
穿越时的操作,并可能导致堆栈溢出,但是这些天您会
需要非常努力地看到一个。

仅在侧面有一个哈希,以跟踪已经访问过的节点,以防万一 一棵树,但连接良好的图。

9
投票

带有递归,因为您实际上可能会遇到堆栈溢出错误,这是Stackoverflow.com,毕竟。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.