缓存感知树的实现

时间:2017-05-04 08:38:49

标签: algorithm performance tree implementation

我有一棵树,每个节点可能有0到 N 个孩子。 tree

用例是以下查询:给定指向两个节点的指针:这些节点是否在树的同一分支内?

实施例

q(2,7) => true
q(5,4) => false

通过书(慢)

直接实现将存储指向父节点的指针和指向每个节点处的子节点列表的指针。但是这会导致性能下降,因为树会在内存中碎片化,因此不能识别缓存。

问题

以紧凑的形式表示树的好方法是什么?整棵树有大约100,000个节点。因此,应该可以找到一种方法使其完全适合CPU缓存。

例如,二进制树通常是represented implicitly as an array,因此非常适合完全存储在CPU缓存中(如果足够小)。

1 个答案:

答案 0 :(得分:2)

您可以预先分配连续的内存块,以便连接所有节点的信息。

之后,每个节点只需要一种方法来检索其信息的开头以及该信息的长度。

在这种情况下,每个节点的信息可以由父节点表示,然后是子节点列表(假设我们在没有父节点时使用-1,表示根节点)。

例如,对于问题中发布的树,节点1的信息为:-1 2 3 4,节点2的信息为:1 5,依此类推。

连续数组将通过连接这些数组获得,结果如下:

-1 2 3 4 1 5 1 9 10 1 11 12 13 14 2 3 5 5 5 3 3 4 4 4 15 4

每个节点都会使用一些元数据来检索其相关信息。如上所述,此元数据需要包含startIndexlength例如对于节点3,我们将startIndex = 6length = 3,它允许检索1 9 10子阵列,指示父节点是节点1及其子节点节点9和10。

此外,元数据信息也可以在开始时存储在连续的存储块中。元数据具有每个节点的固定长度(两个值),因此我们可以根据索引轻松获取某个节点的元数据位置。

通过这种方式,有关图表的所有信息都将存储在一个连续的,缓存友好的内存块中。