【问题标题】:Memory continuity and search tree记忆连续性和搜索树
【发布时间】:2017-08-05 00:06:48
【问题描述】:

我正在尝试在我的结果之上构建一个搜索树。某种末端有 n 个叶子的 k-ary 树。我正在寻找 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

一个好的解决方案应该是什么样的?

【问题讨论】:

  • "... 因为我需要内存一致性。" 这是什么意思?您需要连续内存吗?还有什么?为什么你的树中充满了原始集合中没有出现的值?为什么你的叶子没有排序?
  • 是的,连续内存是正确的方法。对不起我的英语不好。叶子被分类。树使用上部叶子的平均值。最后的叶子 (4, 7, 8, 3, ...) 被分组,其值最接近父级。
  • 好的,所以你有固定深度的 3 叉树和单独的 1 层部分 3 叉树......这看起来不必要地复杂。啊,我明白了,出于某种原因,您需要子树质心值。你到底想达到什么目的?
  • 不是固定的深度。就在这个例子中。深度在 2 和 4 之间变化(8

标签: c++ tree contiguous


【解决方案1】:

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

这种方法浪费大量空间的情况:每个节点的最大分支数量很大,但实际上大多数节点的子节点要少得多。不过,这不会影响找到叶子所需的时间。事实上,让它变得相当快是一种权衡。

考虑在连续内存中有 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多