Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何确定四叉树细分的最佳容量?_Algorithm_Optimization_Big O_Simulation_Quadtree - Fatal编程技术网

Algorithm 如何确定四叉树细分的最佳容量?

Algorithm 如何确定四叉树细分的最佳容量?,algorithm,optimization,big-o,simulation,quadtree,Algorithm,Optimization,Big O,Simulation,Quadtree,我使用Boid算法创建了一个植绒模拟,并集成了一个四叉树进行优化。如果四叉树尚未达到其boid容量,则将boid插入到四叉树中。如果四叉树满足其容量,它将细分为更小的四叉树,其余的BOID将尝试递归地再次插入该四叉树 如果我将容量从默认的4增加到能够容纳更多BOID(如20)的容量,性能似乎会更好,我只是想知道是否有任何规则或方法可以用于按公式选择最佳容量 如果相关的话,您可以实时查看站点或源代码。我认为这在很大程度上取决于您的实现、硬件和数据特征 实施: 一种极端情况是使用GPU处理来比较条目

我使用Boid算法创建了一个植绒模拟,并集成了一个四叉树进行优化。如果四叉树尚未达到其boid容量,则将boid插入到四叉树中。如果四叉树满足其容量,它将细分为更小的四叉树,其余的BOID将尝试递归地再次插入该四叉树

如果我将容量从默认的
4
增加到能够容纳更多BOID(如
20
)的容量,性能似乎会更好,我只是想知道是否有任何规则或方法可以用于按公式选择最佳容量


如果相关的话,您可以实时查看站点或源代码。

我认为这在很大程度上取决于您的实现、硬件和数据特征

实施: 一种极端情况是使用GPU处理来比较条目。如果您支持这一点,那么拥有非常大的节点(可能只有一个节点包含所有条目)可能比任何其他解决方案都要快

硬件: 缓存大小和总线速度将发挥重要作用,这也取决于每个节点和每个条目消耗的内存量。访问未缓存的子节点显然代价高昂,因此您可能希望增加节点的大小以减少子节点的遍历。 ->回到实现上来,将整个四叉树存储在连续的内存段上是非常有益的

数据特征: 集群数据:具有强集群数据可能会对性能产生不利影响,因为这可能会导致树变得非常深。在这种情况下,增加节点大小可能会有所帮助。 大量数据意味着您可能会超过一个阈值,因为所有东西都适合缓存。在这种情况下,将节点变大将节省内存,因为您将拥有更少的节点,并且所有内容都可以再次放入缓存中

根据我的经验,我发现每个节点有10-50个条目在不同的数据集上提供了最好的性能

如果经常更新树,可能需要定义一个阈值,以避免节点“闪烁”和频繁合并/拆分。也就是说,拆分大于25个条目的节点,但仅当得到少于15个条目时才合并它们

如果你对避免退化的“深”四叉树的类似四叉树的结构感兴趣,看看我的。它的结构类似于四叉树,但在位级别上运行,因此最大深度严格限制为64或32,具体取决于数据的位数。实际上,即使是非常密集的数据,深度也很少超过10级左右。注:普通PH树是一个键值“映射”,即每个坐标(=键)只能有一个条目(=值)。这意味着您需要存储列表或条目集,以防任何给定坐标都需要多个条目