八叉树在空间/时间性能或其他方面的优势是什么?在什么情况下它们最适用(我听说过3D图形编程)?
kD树是平衡二叉树,八叉树是 尝试因此优缺点可能是从那些更一般的数据结构继承而来的。特别:
- 重新平衡可能会很昂贵(八木不需要重新平衡)。
- 平衡可以更好地处理异构性,因为它具有自适应性。
- 八叉树中较高的分支因子意味着较浅的树(较少的定向和分配)用于均匀分布。
同样,二分法(如八叉树)在比特旋转方面很容易实现。同样,我认为八叉树在进行范围查找时可以从预先计算的距离中受益匪浅。
编辑
显然,我对尝试和同质性的引用需要澄清。
Tries是由字典树表示的数据结构族,并且用作序列键(最著名的是字符串,但也包含DNA序列以及哈希尝试的哈希值中的位)的字典。如果每个字典映射x,y和z坐标中的每个坐标的一个位(在trie的第一级中的最高有效位,在第二级的下一个有效位等),则trie是均匀地细分3D空间的八叉树。因此,八叉树继承了尝试的特征,通常是:
- 高分支因子可能意味着浅树,几乎不会产生间接指示,因此搜索速度很快,例如,可以将20个级别的二叉树存储在4个级别的树中,分支因子为256。
- 在插入和删除过程中,尝试不会重新平衡,从而节省了平衡二叉树所需的昂贵操作。
缺点是异构性可能导致尝试/八叉树失衡,因此搜索可能需要许多间接操作。尝试中的等效问题通过使用边缘压缩将多个间接级别折叠为单个级别来解决。Octree不会这样做,但是没有什么可以阻止您压缩八叉树(但是我不认为您可以将结果称为八叉树!)。
为了进行比较,请考虑使用专门的字典作为字典字符串字典,将其表示为trie。特里的第一层分支在键的第一个字符上。第二级上第二个字符,依此类推。通过从字典中的键中搜索第一个字符以获取第二个词典来查找任何字符串,该第二个词典用于从键中查找第二个字符,依此类推。一组随机密钥字符串将是同质分布。一组都共享一些前缀的键字符串(例如,所有以“ anti”开头的单词)是异类的分配。在后一种情况下,第一个字典仅包含一个绑定,用于“ a”,第二个仅包含一个绑定,用于“ n”,依此类推。在特里树中搜索任何映射始终是通过使用相同的四个键来搜索相同的四个字典。这是低效的,这就是八叉树的作用,例如,如果八叉树用于存储异质粒子分布,其中绝大多数粒子位于矢量空间内的一小部分中,该八叉树就是这样。