记忆连续性和搜索树

时间:2017-03-14 15:08:57

标签: c++ tree contiguous

我尝试在结果之上构建搜索树。某种k-ary树,最后有n片叶子。我正在寻找一个C ++解决方案并尝试std::vector,但由于我需要内存一致性而无法完成它。它可以通过嵌套向量来完成,但我无法做到。

让我通过例子解释细节:

未排序的结果可能是

Result R = { 4, 7, 8, 3, 1, 9, 0, 2, 2, 9, 6 }

最重要的是,我需要一个树,其节点在我的特定问题中是质心。但为了保持简单,我将在这里使用人工值。

我将搜索树维度定义为

Height H = 2
Branch B = 3

最初的树

4 7 8 3 1 9 0 2 2 9 6

第二步

layer_0          1.6    5      8.2
                   |    |        |
         +-+-+-+-+-+  +-+  +-+-+-+
         | | | | | |  | |  | | | |
layer_1  3 1 0 2 2 3  4 6  7 8 9 9

最后一步

layer_0                 1.6          5           8.2
                          |          |             |
                  +---+---+    +-+---+    +---+----+
layer_1         0.8 1.6 2.4  4.2 5 5.8  6.4 8.2  8.4
                  |       |    |     |    |   |    |
                +-+   +-+-+    |     |    |   |  +-+
layer_2         1 0   2 2 3    4     6    7   8  9 9

最后一棵树不是k-ary树,因为端叶大小为0 <= size <= |R|

此刻我正在试验两个载体。

std::vector<size_t> layer_2;

std::vector<float> leafs;

std::size_t width, height;

widthheight的帮助下,可以浏览leafs。但我问自己如何优雅地连接leafslayer_2

一个好的解决方案怎么样?

1 个答案:

答案 0 :(得分:0)

注意:此解决方案是连续的,因为它使用连续的数据结构(向量或数组)而不是节点指针样式树,但可能会根据应用程序在数据结构中包含未使用的空间。

这种方法浪费了大量空间的情况:每个节点的最大分支数量很大,但大多数节点实际上拥有的子节点要少得多。这对于找到叶子所需的时间没有影响。事实上,让这一点变得非常快是一种权衡。

考虑在连续内存中有4个级别的3分支树: R,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,aab,aac,aba,abb,abc,baa....节点子节点的索引范围从(parent_index * 3)+1到(parent_index * 3)+3

我提到的重要警告是每个节点必须始终在向量,数组中有三个子空间。如果一个节点只说2个子节点,只需用null_child值填充该额外空格即可保留空间。 (这是浪费空间的来源)

现在的好处是,找到所有树叶很容易。

first_leaf_index = 0
for(i=0;i<(4-1);i++)//in this example 4 is the depth
    first_leaf_index += 3^(i) //three is max branches per node

此时只迭代到数据结构的末尾