【发布时间】:2011-11-30 20:26:44
【问题描述】:
我有一棵大树,随着算法的进展而增长。每个节点都包含集合,我想它是作为平衡二叉搜索树实现的。每个节点的集合在创建该节点之后,在用于创建该节点的子节点之前,应保持固定。
不过,我担心复制每组的成本过高。相反,我希望每个新创建的节点集都利用父节点集的所有适当部分。简而言之,我很乐意复制 O(log n) 的集合,而不是 O(n)。
是否有任何 STL 关联数据结构的变体提供这种部分复制优化?也许在 Boost 中?这样的数据结构在 Haskell 或 OCaML 中实现当然是微不足道的,但在 C++ 中需要更多的努力。
【问题讨论】:
-
套装的内容是什么?我没有完全理解你的问题是什么,似乎每个级别的集合都是父母集合的严格子集,是吗?
-
二叉搜索树一般具有有意义的子树,除非您的子节点恰好对应于父节点集合的连续有序子集。无论如何,如果您有父节点和子节点,您已经在实现自己的树结构,那么为什么不将数据保持在正确的级别呢?
-
也很高兴知道,如果一个节点包含父节点的子集,该子集是否连续?
-
每个级别都是一个严格的超集。所有这些集合的存在只是为了终止外部树的分支。我目前有一个未排序的手动链表,它简单地回溯每个树分支,提供 O(n) 搜索重复项、O(1) 插入和 O(1) 每个级别的额外空间。我愿意全盘支付 O(log n),但不会更高。平均而言,一个集合插入应该修改树的 O(log n),使许多子树保持不变。正如 Useless 所指出的,一个最佳的实现经常会改变得更少,但偶尔会改变得更多。然而,平均情况应该是 O(log n)。
-
你一直提到 O(log(n))。有这个价值的理由吗?每个节点是否仅包含其父集的 log(n)?
标签: c++ stl set binary-tree tree-balancing