【发布时间】:2012-09-05 17:34:37
【问题描述】:
我正在尝试创建一个rope 数据结构。它是一种二叉树,即递归数据结构。
绳索的目的是分裂和连接应该快速,这意味着你避免复制整个绳索。
因此,例如,用户应该能够说 rope1 + rope2 并期望在 ~ 对数时间内得到结果。
但是,这带来了一个问题:
如果一条绳索被修改,它的父项也会被间接修改。
因为我的目标是让rope 成为string 的替代品,所以这是不可接受的。
对此我的解决方案是:每当rope 发生任何 类型的更改时,我都会创建一个新 节点,稍作更改,留下旧的未修改。
理论上,我认为这会很好。
但实际上,它涉及为(几乎?)字符串的每次修改进行堆分配。
即使是一个字符的变化也会导致一个新的堆对象,这不仅本身很慢,而且还会显着降低内存局部性,对性能产生非常负面的影响。
我应该如何解决这个问题?
【问题讨论】:
-
那么,您希望拆分和连接速度快,而且其他一切都快吗?我认为这是一个“你不能吃蛋糕也不能吃蛋糕”的例子。
-
如果您有 GCC,请检查
<ext/rope>标头以获取示例实现。 -
“因为我的目标是让绳索成为字符串的替代品,”你不能让
rope成为string的替代品。根据定义,它们是两种不同的数据结构,具有两组不同的操作。string,在 C++11 中,必须是连续的,而你的绳索不是。 -
如果它也被另一个字符串引用,您只需要进行堆分配/复制。您很快就会陷入所有这些副本最终都发生的情况,只是稍后发生并且使用更多开销。
-
@R.MartinhoFernandes:是的,我很害怕...
标签: c++ data-structures ropes