我对AVL有一些疑问,假设我创建了一些整数的avl-tree,我如何管理插入到我的树中以便能够取出最长的数字序列,(插入必须具有复杂性) O(logn)),例如:
_ 10 _
_ 7 _ _ 12 _
6 8
在这种情况下,最长的序列将是6,7,8所以在我的函数void sequence(int* low, int* high)
中我会做* low = 6, *high = 8
......
函数(序列)的复杂性必须为O(1)
提前感谢任何想法
答案 0 :(得分:2)
实际上,如果你构建一个间隔列表或非常类似的东西,然后将它的组件存储在AVL树中,你可能会做得很好。问题是你不只是想要一个给定的序列,你想要最长的序列。最长的词汇紧邻键*,更准确。奇怪的是,我认为这很难实现,而不会抨击自定义指标来构建您的AVL树。我想如果建立在间隔列表上的AVL树的比较器是f(间隔长度),你可以在o(logn)中得到它,或者如果你的AVL实现具有快速最大\ min,则可能更快。
我非常抱歉,我希望能得到更多帮助,但我们必须使用AVL树的事实有点令人不安。我想知道是否有一个技巧可以拉动涉及子树,但我只是看到没有好的方法来做这样的方法o(1)没有那么多的预处理就像是一个笑话。使用bloom过滤器的东西可能有用吗?
* 一些总排序可以创建类似的运行,但并不是所有的都有一个有意义的直接邻接概念在他们......井......相位空间我猜?**
**我的正规教育平淡无奇,现在正在咬我。
答案 1 :(得分:1)
基本插入& AVL树中的旋转保证接近O(logn)性能。
来到问题的第二部分,为了找到序列的“复杂性”,首先需要找到(或遍历)AVL树中的“低”元素,这本身就会带你到最近(LOGN)。
所以O(1)sequence()的复杂性超出了窗口......如果O(1)是必须的,那么AVL树可能不是你的数据结构。