繁体   English   中英

查找树数据结构中所有叶节点的最有效方法

[英]Most performant way to find all the leaf nodes in a tree data structure

我有一个树数据结构,其中每个节点可以有任意数量的子代,树可以具有任何高度。 获取树中所有叶节点的最佳方法是什么? 除了遍历树中的每个路径,直到遇到叶子节点,还有其他更好的方法吗?

在实践中,树的最大深度通常为5左右,树中的每个节点大约有10个子节点。

我对其他类型的数据结构或特殊树持开放态度,这将使叶节点特别理想。

我正在使用javascript,但实际上只是在寻找一般建议,任何语言等。

谢谢!

找到一棵树的叶子是O(n) ,这对于一棵树来说是最佳的,因为您必须查看O(n)位置以检索所有n事物以及沿途的分支节点。 恒定的开销是分支节点。

如果增加分支因子,例如让每个分支有32个子节点而不是2个子节点,则会显着减少开销节点的数量,这可能会使遍历更快。

如果跳过一个分支,则不会在该分支中包含值,因此我们必须查看所有分支。

内存布局对于最佳检索至关重要,因此子列表应该是连续的,而不是链接列表,节点应按检索顺序相互放置。

您的树越是静态,可以完成的布局就越好。

一体化布局

  • 全部排列成一体

  • 专业版

    • 可以流传输内存以实现最大吞吐量(硬件预取)
    • 无需不必要的页面查找
    • 可以进行常规查询
    • 没有多余的内存来制作链接列表。
    • 内部节点使用偏移量查找相对于自身的子级
  • 骗局

    • 插入/删除可能很麻烦
    • 插入/删除O(N)
    • 插入可能会导致数组大小调整,从而导致昂贵的复制

两阵列布局

  • 一个内部节点阵列
  • 一片叶子
  • 内部节点指向叶子

  • 专业版

    • 叶节点可以以最大吞吐量进行流传输(如果您只对叶感兴趣,则可能是最佳布局)。
    • 无需不必要的页面查找
    • 可以进行间接查找
  • 骗局

    • 如果所有叶子都被订购,则插入/删除可能很麻烦
    • 如果叶子无序插入很容易,只需在末尾添加即可。
    • 如果不允许使用逻辑删除,则删除无序叶子也是一个问题,因为最后一块叶子将必须移回并且内部节点需要修复。 (通过其他间接方式,也可以将其固定,请参见插槽图)
    • 调整两者的大小可能会导致复制量较大,尽管比“一体机”要小得多,因为它们可以独立完成。

数组数组(动态大小,向量的C ++向量)

  • 使用连续数组引用每个节点的子级
  • 专业版
    • 快速浏览每个子列表
    • 每个子数组可以独立调整大小
  • 骗局
    • 在消除链接列表子项的许多额外工作的同时,各个列表分散在所有其他数据中,从而使查找花费了更多时间。
    • 插入可能会导致调整大小和复制数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM