我如何在时间 O(log(n)) 的给定节点处拆分 AVL 树?
How can i split an AVL tree at a given node at time O(log(n))?
我一直在绞尽脑汁尝试各种方法,但我得到的最好方法是 O(log^2(n))。
确切的问题是:
创建一个函数 Split(AVLtree T, int k)
其中 returns 2 AVL 树(如元组)使得 T1 中的所有值都小于或等于 k,其余值在 T2 中。 k 不一定在树中。时间必须是 O(log(n))。
假设 AVL 树的有效实现,我设法用时间 O(log(|h1-h2|)).
创建了一个合并函数
如有任何帮助,我们将不胜感激。
你已经快完成了,因为你有合并功能!
在树中定期搜索 k 的后继者。这将追踪出一条从根到该后继节点的树路径。想象一下,以这种方式切割路径上的每条边,这将为您提供 "pennants," 个单个节点的集合,合法的 AVL 树悬挂在两侧。然后,证明如果您以正确的顺序将它们重新合并在一起,合并的成本会形成一个伸缩总和,总计为 O(log n)。
我一直在绞尽脑汁尝试各种方法,但我得到的最好方法是 O(log^2(n))。
确切的问题是:
创建一个函数 Split(AVLtree T, int k)
其中 returns 2 AVL 树(如元组)使得 T1 中的所有值都小于或等于 k,其余值在 T2 中。 k 不一定在树中。时间必须是 O(log(n))。
假设 AVL 树的有效实现,我设法用时间 O(log(|h1-h2|)).
如有任何帮助,我们将不胜感激。
你已经快完成了,因为你有合并功能!
在树中定期搜索 k 的后继者。这将追踪出一条从根到该后继节点的树路径。想象一下,以这种方式切割路径上的每条边,这将为您提供 "pennants," 个单个节点的集合,合法的 AVL 树悬挂在两侧。然后,证明如果您以正确的顺序将它们重新合并在一起,合并的成本会形成一个伸缩总和,总计为 O(log n)。