什么是一个好的和稳定的C ++树实现?

时间:2008-10-08 07:13:49

标签: c++ tree graph-theory

我想知道是否有人可以推荐一个好的C ++树实现,希望是一个 如果可能的话,stl兼容。

为了记录,我之前已经多次编写了树算法,我知道它很有趣,但是如果可能的话,我想要务实和懒惰。因此,实际链接到工作解决方案就是目标。

注意:我正在寻找一个通用树,而不是平衡树或地图/集,在这种情况下,结构本身和树的连接性很重要,不仅仅是数据。 因此,每个分支都需要能够保存任意数量的数据,并且每个分支应该是可单独迭代的。

6 个答案:

答案 0 :(得分:23)

我不知道你的要求,但是如果你对结构感兴趣而不是在树中,那么你不会更好地使用图表(例如Boost Graph中的实现) - 通过平衡速度等具体好处?你可以通过图形“模拟”一棵树,也许它(在概念上)更接近你正在寻找的东西。

答案 1 :(得分:19)

看看this

C ++的tree.hh库为n-ary树提供类似STL的容器类,模板化存储在节点上的数据。提供了各种类型的迭代器(下订单,预订等)。在可能的情况下,访问方法与STL兼容,或者可以使用其他算法。

HTH

答案 2 :(得分:7)

我建议使用std :: map而不是树。

树的复杂性特征是:

插入:O(LN(n))的
删除:O(LN(n))的
发现:O(LN(n))的

这些与std :: map保证的特征相同 因此,大多数std :: map的实现使用了封面下的树(红黑树)(虽然从技术上讲这不是必需的)。

答案 3 :(得分:3)

好的伙计们,我找到了另一个树库; stlplus.ntree。但尚未尝试过。

答案 4 :(得分:2)

如果您没有(键,值)对,只需要键,请使用std :: set。它使用与std :: map相同的红黑树。

答案 5 :(得分:-1)

假设问题是关于平衡(在某种形式,主要是红黑树)二叉树,即使不是这种情况。

平衡二进制树,像vector一样,允许管理元素的一些排序而不需要键(比如在向量中的任何位置插入元素),但是:

  • 对于一个元素的所有修改具有最佳O(log(n))或更高的复杂度(在开始时添加/删除,在任何迭代器之前和之后结束
  • 使用 persistance 迭代器,除了直接破坏迭代器指向的元素之外的任何修改。

可选地,可以支持像向量中的索引访问(具有一个size_t的元素),具有O(log(n))复杂度。如果使用,迭代器将是随机的。

可选的顺序可以通过一些比较函数强制执行,但迭代器的持久性允许使用不可重复的比较方案(例如:在交通拥堵期间任意车道变化)。

实际上,平衡二叉树具有矢量,列表,双链表,映射,多图,双端队列,队列,优先级等等的接口,并且对于所有单个元素操作都具有理论上的最优O(log(n))复杂度。

<讽刺>这可能是为什么c ++ stl不建议它< / sarcastic>

由于难以正确管理平衡,特别是在元素提取过程中,个人可能无法自行实现一般平衡树。

没有广泛可用的平衡二叉树实现,因为最先进的红黑树(此时由于移除期间固定数量的昂贵的树重组而导致的最佳类型的平衡树)知道实现,每个人都被盲目复制来自结构发明者的初始代码的实现者,不允许迭代器持久性。这可能是缺少完全功能树模板的原因。