【问题标题】:Finding minimal element not presenting in a given AVL tree查找未出现在给定 AVL 树中的最小元素
【发布时间】:2016-09-13 21:19:12
【问题描述】:

给定一棵 AVL 树,它存储了一组由 n 个不同个自然数组成的 G。在每个节点中存储以该节点为根的子树中的节点数。

我们如何找到不在 G 中且在 O(log n) 的时间复杂度上大于给定 p 的最小 m?

例子:

如果G={21,22,23,24,26,27,29,30} 那么:p=20 => m=25 p=22 => m=25 p=25 => m=28 p=29 => m=31

【问题讨论】:

  • 我们可以为每个节点添加额外的信息吗?
  • @templatetypedef 这是给定的。你有什么想法?
  • 我想如果每个子树也存储它的最小值和最大值,这会更容易。
  • @templatetypedef 但它没有......也许可以用 max 节点(我们可以在 O(log n) 中得到)以及 max 和 p 的差异来做一些事情?

标签: algorithm binary-search-tree avl-tree


【解决方案1】:

假设您是在数组而不是 AVL 树上解决这个问题。你会怎么做呢?首先,首先对数组进行二分搜索,以找到大于 p 的最小数 s。如果该数字大于 p+1,则返回 p+1。否则,我们处于一些元素运行的中间,需要找到运行后的最小数字。为此,您可以考虑解决以下问题:找到最小元素 x 使得 x - s 大于 x 的索引减去 s 的索引。这可以通过对数组的剩余一半进行二进制搜索来完成:如果当前元素与 s 之间的差等于当前元素与 s 之间的距离,则向右走,否则向左走。找到这个元素 x 后,转到它之前的元素,添加一个,这就是你的答案。

要在 AVL 树上解决这个问题,您基本上将上述算法调整为使用树搜索而不是二叉搜索。您拥有子树大小信息这一事实意味着您可以使用标准顺序统计技术确定树中任何元素的索引。我想最终的算法会有点乱,但它会在 O(log n) 的时间内忠实地模拟上述算法。

【讨论】:

  • @XtremeJoe 不是。一次搜索以找到第一个值 >= p,然后再次搜索以找到缺失的元素。
  • @XtremeJoe 你能详细说明一下吗?这应该在 O(log n) 时间内运行。
  • @templatetypedef 在数组示例中为 O(log n),因为您可以获得 O(1) 中的索引。但是在树中,获取索引是 O(log n)。并且搜索本身是 O(log n)...(除非我们在搜索元素时更新索引?然后就可以了,对吧?)
  • @XtremeJoe 而不是尝试通过使用“真正的”二进制搜索并将索引映射到节点来实现二进制搜索步骤,这将花费时间 O((log n)^2),而是只需执行在树上行走,通过从每个节点向左或向右来模拟二分搜索。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多