Barnes Hut最坏情况记忆情景

时间:2012-06-26 18:54:25

标签: memory octree

我想运行Barnes Hut N-body模拟(Wikipedia article)。我知道八叉树的单个节点将占用多少内存,但我无法弄清楚对于给定数量的粒子,最坏情况下的内存使用情况。简而言之,我想知道对于给定数量的粒子,八叉树中可能存在多少个节点。我需要知道这一点,知道为八叉树分配多少内存。

编辑:

哦,如果有人想给我代码而不是公正和解释,我就用C写作。

我有这个,这比最糟糕的情况更糟糕。但它保证至少分配足够的内存。我希望有人能给我一些更有效的记忆。

int KBH_worstcase(int particles)
{ // returns number of nodes required to store a number of particles in a worst case scenario
    int worst;
    unsigned int n;
    worst=1;
    n=1;
    while(n<particles)
    {
        n=n<<3;
        worst+=n;
    }
    return worst;
}

2 个答案:

答案 0 :(得分:2)

我不确定是否存在这样一个合适的标准。八叉树考虑了在模拟过程中可能发生变化的粒子分布。因此,树的有效深度不能仅依赖于粒子的数量。

一个虚假解决方案可能是定义树深度(或节点数量)的界限。在这种情况下,您可以将更多粒子组合在一个单元格(八叉树的叶子)中,然后回归到身体 - 身体的相互作用。 但是如果你想要对树结构进行更多控制,那么最好能够在必要时分配新节点。

答案 1 :(得分:0)

实际上,四叉树(或三维八叉树)所需节点数的上限不受粒子总数的对数限制。

通常,节点中的空间分为四个相等象限。考虑与根节点的边界框相比,两个粒子彼此非常接近的情况。在这里很容易看出,在到达具有单个粒子的节点之前,需要创建许多内部节点。见下面的草图。

enter image description here

许多内部节点 - 只有两个点

两个维度的上限应该是(我的头顶)

log4 w / m

其中w是根节点的边界框的大小,m是任意两个粒子之间的最短距离。

然而,计算任意两点之间的最短距离具有O(n ^ 2)复杂度,这是你想要避免的。

您可以改为将算法修改为仅将树构建到最大深度d。这会将内存消耗限制为4 ^(d + 1)-1个节点。

您还需要小心处理具有多个粒子的节点的交互,例如:回到天真的O(n ^ 2)算法。