【问题标题】:Find an algorithm in RBTREE in O(logn)在 O(logn) 中找到 RBTREE 中的算法
【发布时间】:2011-01-15 05:25:35
【问题描述】:

我需要找到一个可以通过以下操作执行的数据结构:

  • 构建(S,k) - O(nlogn)
  • 搜索(S,k) - O(logn)
  • 插入(S,k) - O(logn)
  • 删除(S,k) - O(logn)
  • Decrease-Upto(s,k,d) - O(logn) - 此方法应减去 的每个节点 d(d>0)

显而易见的首选是 RedBlackTree。

但是,我无法找到关于 O(Logn) 中的 Decrease-Upto 的解决方案。 如果 k 大于树中的最大键会发生什么 - 这种情况下我必须更新整个树。

有人可以提出其他建议吗?也许有一些提示?

【问题讨论】:

  • 该方法应该减去d 是什么,应该从哪里做呢? oO
  • d 是一个数字,k 是一个与节点键进行比较的数字,n 是节点数,即树。
  • 很明显d 是一个数字,而不是小马;但是应该从哪里减去?来自密钥小于k的所有节点?
  • 是的,关键节点小于或等于 k
  • 抱歉,我的问题不准确。您应该从键小于k 的那些节点的 或它们的关联数据 中减去d

标签: algorithm binary-tree red-black-tree


【解决方案1】:

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

要执行Decrease-Upto,您只需更改从根开始的一条路径上 O(log n) 个节点的增量。

您不必在此操作后更改树的结构,因为它不会更改键的顺序。

【讨论】:

  • 听起来差不多。当然,您必须适当地处理儿子。
  • 好吧,既然 OP 在 cmets 中告诉“你应该从键中减去”,这听起来是错误的 :-)
  • @Pavel 我以为 SO 上的人知道还有所谓的“负数”:-)
猜你喜欢
  • 2016-02-11
  • 2022-10-13
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多