2010-02-10 27 views
4

我需要找到一个数据结构,我可以用下面的动作做:查找RBTREE在O(LOGN)的算法

  • 生成(S,K) - O(nlogn)
  • 搜索(S,K) - O(logn)时间
  • 插入(S,K) - O(logn)时间
  • 删除(S,K) - O(logn)时间
  • 减少-高达(S,K,d ) - O(logn) - 此方法应该将每个节点减去d(d> 0),即< = k

明显的第一选择是RedBlackTree。

但是,我不能找到有关O(Logn)中的减少-Upto的解决方案。 如果k大于树中的最大密钥,会发生什么情况 - 这种情况下,我需要更新整棵树。

有人可以建议吗?也许有些提示?

+0

什么是该方法应该减去,应该从哪里去做? o – 2010-02-10 11:11:18

+0

d是一个数字,k是一个与节点密钥相比较的数字,n是节点数目是树。 – Idan 2010-02-10 11:12:57

+0

这很明显,'d'是一个数字,而不是一匹小马;但*从哪里*应该减去?从小于'k'的所有节点? – 2010-02-10 11:15:34

回答

4

您可以在树的每个节点中存储一个额外的值,我们称它为delta。将节点的增量添加到存储在其所有后代中的键中以获取实际键。因此,要获取某个特定节点中密钥的实际值,可以将所有从根节点到该节点的增量相加,并将该和加到存储的密钥中。

要做Decrease-Upto,您只需更改根(root)的一个路径上O(log n)个节点的增量。

在此操作之后,您不必更改树的结构,因为不会更改密钥的排序。

+0

减去声音的权利。当然你必须妥善处理儿子。 – Idan 2010-02-10 14:39:09

+0

好吧,因为OP在评论中告诉你“你应该从键中减去”,这听起来是错误的:-) – 2010-02-10 14:49:31

+0

@Pavel我以为人们都知道,也有所谓的“负数”:-) – svick 2010-02-10 21:43:04