【问题标题】:How are large tree data structures traversed?大树数据结构是如何遍历的?
【发布时间】:2016-06-02 12:47:51
【问题描述】:

我正在研究树算法,几乎所有算法都使用递归进行遍历,当然遍历也可以在没有递归的情况下完成(通过创建堆栈数据结构和 while 循环)。但是出于好奇想知道当树中存在数百万或数十亿个节点时如何遍历这些树数据结构?当然,这些问题也在面试中被问到。

我能想到的一些方法是

  • 将树存储在多个文件中作为不同的子树并遍历 通过文件
  • 在不同的机器上分布树
  • 在数据库中以表结构存储树并设计查询 遍历

任何更好的方法,如果有人可以分享此类问题的学习材料的链接,将会有所帮助。

【问题讨论】:

  • 如此接近:这是一个编程问题。你为什么要关闭它?

标签: algorithm recursion graph tree


【解决方案1】:

如果这棵树适合记忆,你就可以走它。我构建了构建具有数百万个节点的 AST 的工具(都来自大量树,有时来自非常深的树);我们将树存储在内存中。递归遍历工作得很好。而且,如果操作正确,每个节点(缓存行未命中时间)只需几十纳秒。

固定大小的堆栈通常会搞砸,因为这样的堆栈会阻止任意深度递归。请参阅How does a stackless language work? 我编写树操作的语言没有固定大小的堆栈。

您可以将分布在机器上的树存储起来,或者(更糟!)存储在数据库中。你仍然可以走过那棵树,但算法比较笨拙,而且通信(与远程机器、数据库表)的额外延迟使得这个操作变得如此缓慢,几乎没有人这样做。

【讨论】:

  • 感谢 Ira 的回答,非固定大小的堆栈是什么意思,主要是当我们进行递归时,使用系统堆栈并且它是固定的?可能是我没听懂?
  • 当我们进行递归时,我们使用 some 堆栈。如果它定义为连续存储,通常它具有预先分配的大小。阅读提供的链接。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2022-01-22
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多