基于 STL 双端队列的树与自己的二叉树实现?

Posted

技术标签:

【中文标题】基于 STL 双端队列的树与自己的二叉树实现?【英文标题】:STL deque based tree vs own implementation of binary tree? 【发布时间】:2012-05-23 08:22:02 【问题描述】:

这是对 Is a list implementation of binary tree scalable?

树实现的优点或缺点是什么 使用线性数组(stl 向量)或 stl deque

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

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

【问题讨论】:

【参考方案1】:

嗯,我会说是这些:

对于指针树,您将内存用于数据和指向数据的指针,而对于std::vector,您只为数据分配内存(容器处理迭代自身) 如果你使用std::vector,你的内存是本地化的。例如。如果你想访问一棵树的一个完整的,这将在内存中是连续的,而单独分配的各个节点,你会像兔子一样跳过内存访问所有这些 如果您分配单个节点,您实际上无法分配它们,除非单独分配。这意味着对malloc-euqivalent 函数的大量调用。 (在 C 中你可以使用一些技巧来避免这种情况,它们在 C++ 中仍然有效,但如果你有现成的 std::vector 解决方案,为什么还要使用 hacks)。 创建向量时,可以使用std::vector.reserve()预分配所有内存。此外,如果您知道向量是如何运行的,您就会知道它会调用 malloc-equivalent 来大约在每次启动树的新级别时保留内存 - 分配数应该大致等于树中的级别数 访问向量的元素非常简单,在基于向量的完全填充的二叉树中导航非常直观且易于使用

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于基于 STL 双端队列的树与自己的二叉树实现?的主要内容,如果未能解决你的问题,请参考以下文章

平衡二叉树与java实现

C语言的世界-树与二叉树

树与二叉树

数据结构期末复习——树与二叉树一些知识点

[知识点] 7.3 树与二叉树

第九周