我需要找到一个数据结构,我可以通过以下操作来完成:
显而易见的第一个选择是RedBlackTree。
但是,我不能在O(Logn)中找到关于Decrease-Upto的解决方案。 如果k大于树中的最大密钥会发生什么 - 这种情况我必须更新整个树。
有人可以建议吗?也许有些提示?
答案 0 :(得分:4)
您可以在树的每个节点中存储一个额外的值,我们称之为delta。您将节点的增量添加到存储在其所有后代中的键以获取实际键。因此,要获取特定节点中密钥的实际值,请将从根到该节点的所有增量求和,并将此总和添加到存储的密钥中。
要执行Decrease-Upto
,只需在根路径上更改O(log n)节点的增量。
在此操作之后,您不必更改树的结构,因为它不会更改键的顺序。