二叉树的列表实现是否可伸缩?

时间:2012-05-23 07:33:22

标签: c++ stl tree binary-tree

我正在编写一个简单的编解码器。树将被预先计算,并且一旦构建就不会有任何变化。它只会被搜查。

平衡二叉树的所有叶节点都是信号值,内部节点是近似压缩表示。

如果我有一个很大的叶子节点值,那么使用stl向量的列表实现是否可伸缩? 目前我不知道它有多大。

列出实施例如1,2,3,4,5,6,7 如果我有4个叶子节点

然后是

的孩子
root(1)-> 2,3
2->4,5
3->6,7

所以我可以简单地使用他们在向量中的位置跳转到孩子们。

2 个答案:

答案 0 :(得分:4)

在这种情况下,使用“list”或“array”不应该造成任何问题(因为树是不可变的)。 O(log n)搜索的唯一要求是快速随机访问(即对给定索引的O(1)访问)。

您可以使用vectordeque,两者都适用。如果系统找不到足够大的内存块来容纳所有元素,那么您可能会遇到vector的可伸缩性问题,尽管从它开始应该证明它更简单。如果您遇到此障碍,请切换到deque,虽然您可能会失去一些速度,但由于其碎片性质,它应该会让您进一步增长。

答案 1 :(得分:0)

我更喜欢使用MAX_ELEMENTS预先分配的树节点的预分配数组(主要是在初始化时进行malloced)而不是stl向量,原因很简单,因为所有树节点都连续位于堆上,以便在运行时更快地访问。

我说访问速度更快主要是因为指针跳转对于列表中的大量元素(例如溢出32位数字)的分布式stl向量元素可能不一致

您可以从缓存行中查看它从L1缓存访问您处理器的角度来看。