Algorithm 查找树数据结构中所有叶节点的最有效方法
我有一个树数据结构,每个节点可以有任意数量的子节点,树可以有任意高度。获取树中所有叶节点的最佳方法是什么?有没有可能做得比只遍历树中的每条路径更好,直到我碰到叶节点 实际上,树的最大深度通常为5左右,树中的每个节点将有大约10个子节点 我对其他类型的数据结构或特殊的树持开放态度,这将使获取叶节点变得特别优化 我正在使用javascript,但实际上只是寻找一般的建议,任何语言等Algorithm 查找树数据结构中所有叶节点的最有效方法,algorithm,performance,optimization,tree,Algorithm,Performance,Optimization,Tree,我有一个树数据结构,每个节点可以有任意数量的子节点,树可以有任意高度。获取树中所有叶节点的最佳方法是什么?有没有可能做得比只遍历树中的每条路径更好,直到我碰到叶节点 实际上,树的最大深度通常为5左右,树中的每个节点将有大约10个子节点 我对其他类型的数据结构或特殊的树持开放态度,这将使获取叶节点变得特别优化 我正在使用javascript,但实际上只是寻找一般的建议,任何语言等 谢谢 查找树的叶子是O(n),这对于树来说是最佳的,因为您必须查看O(n)位置才能检索所有n事物,以及沿途的分支节点。
谢谢 查找树的叶子是
O(n)
,这对于树来说是最佳的,因为您必须查看O(n)
位置才能检索所有n
事物,以及沿途的分支节点。恒定的开销是分支节点
如果我们增加分支因子,例如,让每个分支有32个子节点而不是2个子节点,我们将显著减少开销节点的数量,这可能会加快遍历速度
如果我们跳过一个分支,我们不会在该分支中包含值,因此我们必须查看所有分支。查找树的叶子是
O(n)
,这对树来说是最佳的,因为您必须查看O(n)
位置来检索所有n
内容,以及沿途的分支节点。恒定的开销是分支节点
如果我们增加分支因子,例如,让每个分支有32个子节点而不是2个子节点,我们将显著减少开销节点的数量,这可能会加快遍历速度
如果我们跳过一个分支,我们不会在该分支中包含值,因此我们必须查看所有分支。内存布局对于优化检索至关重要,因此子列表应该是连续的,而不是链表,节点应该按检索顺序排在彼此之后 树越静态,布局就越好 一体式布局
- 完全有序的多功能阵列
- 专业的
- 内存可以流式传输以获得最大吞吐量(硬件预取)
- 没有不必要的页面查找
- 可以进行正常的查找
- 没有额外的内存来制作链表
- 内部节点使用偏移量查找相对于自身的子节点
- 骗局
- 插入/删除可能很麻烦
- 插入/删除O(N)
- 插入可能会导致调整阵列的大小,从而导致成本高昂的拷贝
- 一个用于内部节点的数组
- 一个用于叶的数组
- 内部节点指向叶
- 专业的
- 叶节点可以以最大吞吐量进行流式传输(如果您最感兴趣的是叶节点,则可能是最佳布局)
- 没有不必要的页面查找
- 可以进行间接查找
- 骗局
- 如果订购了所有叶片,则插入/删除可能会很麻烦
- 如果叶子无序插入,只需在末尾添加即可
- 如果不允许删除墓碑,那么删除无序的叶子也是一个问题,因为最后一个叶子必须向后移动,内部节点需要修复。(通过进一步的间接方式,也可以修复此问题,请参见插槽映射)
- 调整其中一个的大小可能会导致一个大的副本,尽管比“一体机”小,因为它们可以独立完成
数组数组(动态大小,C++向量向量)< /P>
- 使用连续数组引用每个节点的子节点
- 专业的
- 快速浏览每个子列表
- 每个子数组可以独立调整大小
- 骗局
- 虽然删除了链表子项的许多额外工作,但单个列表分散在所有其他数据中,使得查找需要额外的时间
- 插入可能会导致调整数组的大小和复制
- 完全有序的多功能阵列
- 专业的
- 内存可以流式传输以获得最大吞吐量(硬件预取)
- 没有不必要的页面查找
- 可以进行正常的查找
- 没有额外的内存来制作链表
- 内部节点使用偏移量查找相对于自身的子节点
- 骗局
- 插入/删除可能很麻烦
- 插入/删除O(N)
- 插入可能会导致调整阵列的大小,从而导致成本高昂的拷贝
- 一个用于内部节点的数组
- 一个用于叶的数组
- 内部节点指向叶
- 专业的
- 叶节点可以以最大吞吐量进行流式传输(如果您最感兴趣的是叶节点,则可能是最佳布局)
- 没有不必要的页面查找
- 可以进行间接查找
- 骗局
- 如果订购了所有叶片,则插入/删除可能会很麻烦
- 如果叶子无序插入,只需在末尾添加即可
- 如果不允许删除墓碑,那么删除无序的叶子也是一个问题,因为最后一个叶子必须向后移动,内部节点需要修复。(通过进一步的间接方式,也可以修复此问题,请参见插槽映射)
- 调整其中一个的大小可能会导致一个大的副本,尽管比“一体机”小,因为它们可以独立完成
数组数组(动态大小,C++向量向量)< /P>
- 使用连续数组引用每个节点的子节点
- 专业的
- 运行