基于STL deque的树与自己实现的二叉树?

时间:2012-05-23 08:22:02

标签: c++ binary-tree

这是一个跟进 Is a list implementation of binary tree scalable?

完成树实现的优点和缺点是什么 使用线性数组(stl vector)或stl deque

而不是具有左右指针的单个节点的二叉树?

假设: 树将被预先计算,一旦构建就不会被修改,并且仅用于搜索。

2 个答案:

答案 0 :(得分:2)

好吧,我会说这些是:

  • 使用指针树,您将内存用于数据和指向数据的指针,而使用std::vector时,您只需为数据(容器)分配内存处理迭代自己)
  • 如果您使用std::vector,则内存已本地化。例如。如果你想访问一棵树的一个完整的级别,那将是连续的内存,而单独分配的个别节点,你会像兔子兔子一样跳过内存访问所有
  • 如果您分配单个节点,实际上除了单独分配外,您实际上无法分配它们。这意味着对malloc - euqivalent函数的大量调用。 (你可以使用一些技巧来避免在 C 中使用它们,并且它们仍然在C++中工作,但如果你有一个准备好的std::vector解决方案,为什么还要使用黑客攻击。
  • 创建向量时,可以使用std::vector.reserve()预分配所有内存。另外,如果你知道向量是如何运作的,你知道它会调用一个malloc - 相当于每次启动树的新级别时保留内存 - 分配的数量应该大致等于你的树
  • 访问矢量元素非常简单,浏览基于矢量的完全填充的二叉树非常直观且易于使用

答案 1 :(得分:2)

数组(包括std::vector)提供良好的locality of reference并节省一些空间,因为它们将数据保存在连续的块中,而指针树可能会将其节点分散到整个内存中并导致分配器开销。 / p>

对于预先计算的树,请选择将其存储在vector中。使用binary heaps常用的布局,可以非常有效地存储完整的(或接近完整的)二叉树。

(通过选择一个好的分配器可以避免树中的开销,但C ++标准库只提供一个通用的。)