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

Algorithm 查找树数据结构中所有叶节点的最有效方法,algorithm,performance,optimization,tree,Algorithm,Performance,Optimization,Tree,我有一个树数据结构,每个节点可以有任意数量的子节点,树可以有任意高度。获取树中所有叶节点的最佳方法是什么?有没有可能做得比只遍历树中的每条路径更好,直到我碰到叶节点 实际上,树的最大深度通常为5左右,树中的每个节点将有大约10个子节点 我对其他类型的数据结构或特殊的树持开放态度,这将使获取叶节点变得特别优化 我正在使用javascript,但实际上只是寻找一般的建议,任何语言等 谢谢 查找树的叶子是O(n),这对于树来说是最佳的,因为您必须查看O(n)位置才能检索所有n事物,以及沿途的分支节点。

我有一个树数据结构,每个节点可以有任意数量的子节点,树可以有任意高度。获取树中所有叶节点的最佳方法是什么?有没有可能做得比只遍历树中的每条路径更好,直到我碰到叶节点

实际上,树的最大深度通常为5左右,树中的每个节点将有大约10个子节点

我对其他类型的数据结构或特殊的树持开放态度,这将使获取叶节点变得特别优化

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


谢谢

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

如果我们增加分支因子,例如,让每个分支有32个子节点而不是2个子节点,我们将显著减少开销节点的数量,这可能会加快遍历速度


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

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

如果我们增加分支因子,例如,让每个分支有32个子节点而不是2个子节点,我们将显著减少开销节点的数量,这可能会加快遍历速度


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

内存布局对于优化检索至关重要,因此子列表应该是连续的,而不是链表,节点应该按检索顺序排在彼此之后

树越静态,布局就越好

一体式布局

  • 完全有序的多功能阵列

  • 专业的

    • 内存可以流式传输以获得最大吞吐量(硬件预取)
    • 没有不必要的页面查找
    • 可以进行正常的查找
    • 没有额外的内存来制作链表
    • 内部节点使用偏移量查找相对于自身的子节点
  • 骗局

    • 插入/删除可能很麻烦
    • 插入/删除O(N)
    • 插入可能会导致调整阵列的大小,从而导致成本高昂的拷贝
双阵列布局

  • 一个用于内部节点的数组
  • 一个用于叶的数组
  • 内部节点指向叶

  • 专业的

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

    • 如果订购了所有叶片,则插入/删除可能会很麻烦
    • 如果叶子无序插入,只需在末尾添加即可
    • 如果不允许删除墓碑,那么删除无序的叶子也是一个问题,因为最后一个叶子必须向后移动,内部节点需要修复。(通过进一步的间接方式,也可以修复此问题,请参见插槽映射)
    • 调整其中一个的大小可能会导致一个大的副本,尽管比“一体机”小,因为它们可以独立完成

数组数组(动态大小,C++向量向量)< /P>

  • 使用连续数组引用每个节点的子节点
  • 专业的
    • 快速浏览每个子列表
    • 每个子数组可以独立调整大小
  • 骗局
    • 虽然删除了链表子项的许多额外工作,但单个列表分散在所有其他数据中,使得查找需要额外的时间
    • 插入可能会导致调整数组的大小和复制

内存布局对于优化检索至关重要,因此子列表应该是连续的,而不是链表,节点应该按照检索顺序排列

树越静态,布局就越好

一体式布局

  • 完全有序的多功能阵列

  • 专业的

    • 内存可以流式传输以获得最大吞吐量(硬件预取)
    • 没有不必要的页面查找
    • 可以进行正常的查找
    • 没有额外的内存来制作链表
    • 内部节点使用偏移量查找相对于自身的子节点
  • 骗局

    • 插入/删除可能很麻烦
    • 插入/删除O(N)
    • 插入可能会导致调整阵列的大小,从而导致成本高昂的拷贝
双阵列布局

  • 一个用于内部节点的数组
  • 一个用于叶的数组
  • 内部节点指向叶

  • 专业的

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

    • 如果订购了所有叶片,则插入/删除可能会很麻烦
    • 如果叶子无序插入,只需在末尾添加即可
    • 如果不允许删除墓碑,那么删除无序的叶子也是一个问题,因为最后一个叶子必须向后移动,内部节点需要修复。(通过进一步的间接方式,也可以修复此问题,请参见插槽映射)
    • 调整其中一个的大小可能会导致一个大的副本,尽管比“一体机”小,因为它们可以独立完成

数组数组(动态大小,C++向量向量)< /P>

  • 使用连续数组引用每个节点的子节点
  • 专业的
    • 运行