【问题标题】:Is a list implementation of binary tree scalable?二叉树的列表实现是否可扩展?
【发布时间】:2012-05-23 07:33:21
【问题描述】:

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

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

如果我有大量叶节点,使用 stl 向量的列表实现是否可扩展? 目前我不知道到底有多大。

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

然后是孩子

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

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

【问题讨论】:

  • 为什么你必须向班级的客户公开这个细节(列表是如何实现的)?如果您有任何性能问题(现在或将来,但测试是某种强制性的),只需更改实施 et-voila(例如,使用调解器)。

标签: c++ stl tree binary-tree


【解决方案1】:

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

您可以使用vectordeque,两者都适合。如果系统无法找到足够大的内存块来容纳所有元素,您可能会遇到vector 的可扩展性问题,尽管开始它应该证明更简单。如果你遇到了这个障碍,请切换到deque,虽然你可能会失去一些速度,但由于它的分散性,它应该能让你进一步成长。

【讨论】:

  • deque 不会让你在 O(1) 中随机访问。
  • @HimadriChoudhury:因为我不能完全链接到标准,我会做次佳; SGI deque 模拟了一个 Random Access Container,它读取复杂性保证“元素访问的运行时复杂性是摊销的常数时间。”
  • @Matthiew。感谢您的链接。我没有意识到这是如何指定双端队列的随机访问。不过,根据我的经验,双端队列的随机访问比向量慢得多。例如,在我的带有 gcc 3.4.6 的 Linux 机器上,从 10M 整数向量中随机求和 10M 整数大约需要 0.4 秒,而在双端队列上是 0.9 秒。
  • @HimadriChoudhury:我觉得这很合适。 vector 引发单个取消引用,而 deque 引发 2(获取桶 + 获取桶中的元素),因此两倍的时间是正确的因素。
【解决方案2】:

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

我说访问更快主要是因为指针跳转可能与分布式 stl 向量元素不一致,因为列表中的元素数量非常庞大(比如溢出 32 位数字)

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

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多