【发布时间】:2011-08-10 06:08:07
【问题描述】:
我理解为什么一个人不能这样做(再平衡和其他东西):
iterator i = m.find(33);
if (i != m.end())
i->first = 22;
但到目前为止,更改键的唯一方法(我知道)是从树中删除节点,然后用不同的键插入值:
iterator i = m.find(33);
if (i != m.end())
{
value = i->second;
m.erase(i);
m[22] = value;
}
这对我来说似乎相当低效,原因有很多:
-
遍历树三次(+平衡)而不是两次(+平衡)
-
另一个不必要的值副本
-
不必要的释放,然后重新分配树内的节点
我发现分配和释放是这三个中最差的。我错过了什么还是有更有效的方法来做到这一点?
我认为,理论上应该是可能的,所以我认为改变不同的数据结构是不合理的。这是我想到的伪算法:
-
在树中找到我要更改其键的节点。
-
如果从树中分离(不要释放)
-
再平衡
-
更改分离节点内的键
-
将节点重新插入树中
-
再平衡
【问题讨论】:
-
是的,它效率低下。如果不适合用例,请使用不同的数据结构
-
@sehe,我不认为这是数据结构的问题,如果我要创建自己的,我最终会得到相同的红黑树,只有不同之处有一个方法可以重用节点而不是分配和重新分配。
-
@Chowlett,谢谢,我会记住的。
-
“1.遍历树三次(+平衡)而不是两次(+平衡)” - 它是两次而不是一次......
end()不需要遍历。 -
@TonyDelroy 我相信 operator[] 是第三个。
标签: c++ performance dictionary binary-tree std