给定AVL树,其存储n个不同自然数的集合G.在每个节点中存储了以该节点为根的子树中的节点数。
如何在O(log n)的时间复杂度中找到不在G中且大于给定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
答案 0 :(得分:1)
想象一下,你是在一个数组而不是一个AVL树上解决这个问题。你怎么可能这样做?首先,首先对数组进行二进制搜索,找到大于p的最小数。如果该数字大于p + 1,则返回p + 1。否则,我们处于一些元素运行的中间,需要找到经过运行的最小数字。为此,您可以考虑解决以下问题:找到最小元素x,使得x - s大于x的索引减去s的索引。这可以通过对数组的剩余一半进行二分搜索来完成:如果当前元素和s之间的差异等于当前元素和s之间的距离,则向右移动,否则向左移动。一旦你找到了这个元素x,转到它之前的元素,添加一个,这就是你的答案。
要在AVL树上解决此问题,您基本上调整上述算法以使用树搜索而不是二进制搜索。您具有子树大小信息这一事实意味着您可以使用标准顺序统计技术确定树中任何元素的索引。我想最终的算法会有点混乱,但它会在时间O(log n)中忠实地模拟上述算法。