我正在编写一个简单的编解码器。树将被预先计算,并且一旦构建就不会有任何变化。它只会被搜查。
平衡二叉树的所有叶节点都是信号值,内部节点是近似压缩表示。
如果我有一个很大的叶子节点值,那么使用stl向量的列表实现是否可伸缩? 目前我不知道它有多大。
列出实施例如1,2,3,4,5,6,7 如果我有4个叶子节点
然后是
的孩子root(1)-> 2,3
2->4,5
3->6,7
所以我可以简单地使用他们在向量中的位置跳转到孩子们。
答案 0 :(得分:4)
在这种情况下,使用“list”或“array”不应该造成任何问题(因为树是不可变的)。 O(log n)搜索的唯一要求是快速随机访问(即对给定索引的O(1)访问)。
您可以使用vector
或deque
,两者都适用。如果系统找不到足够大的内存块来容纳所有元素,那么您可能会遇到vector
的可伸缩性问题,尽管从它开始应该证明它更简单。如果您遇到此障碍,请切换到deque
,虽然您可能会失去一些速度,但由于其碎片性质,它应该会让您进一步增长。
答案 1 :(得分:0)
我更喜欢使用MAX_ELEMENTS预先分配的树节点的预分配数组(主要是在初始化时进行malloced)而不是stl向量,原因很简单,因为所有树节点都连续位于堆上,以便在运行时更快地访问。
我说访问速度更快主要是因为指针跳转对于列表中的大量元素(例如溢出32位数字)的分布式stl向量元素可能不一致
您可以从缓存行中查看它从L1缓存访问您处理器的角度来看。