我有一组带有一组数字的树,其中每个数字都有2个相关的字符串:a和b。所以结构看起来像:
每个节点一个数-B
。
我想获得树中的最大数量,其中a = b在O(log n)最坏情况下运行时间。
我的方法: 试过一棵红黑树。如果数字在右子树中,则其具有O(log n)。 但如果数字在左子树中,则为O(n)。
不能使用常规BST,因为在最坏的情况下,它有O(n)作为运行时。
答案 0 :(得分:2)
对于每个子树,您可以在树的节点中存储最大可能值。
对于给定的树,可以从根读取所需的最大值。
在插入/删除/旋转期间,此属性可以在O(log n)时间内维护。
Cormen等人的算法导论(通常称为CLR书)中有一章叫做扩充数据结构。就此而言。
我建议你看看。相关定理是定理14.1,其中陈述
让
f
成为增加T
个n
个节点的红黑树f
的字段 假设只能使用计算节点x
的{{1}}的内容 节点x
,left(x)
和right(x)
中的信息,包括f(left(x))
和f(right(x))
。然后,我们可以在f
的所有节点中维护T
的值 在插入和删除过程中没有渐近地影响O(log n)
执行这些操作。
left(x)是x等的左子项。
对于您的情况,如果g(node)
将node.number
定义为node.a == node.b
,否则定义为-infinity
。
将f(x)
定义为max f(left(x)), f(right(x)), g(x)
。
答案 1 :(得分:1)
一种解决方案是保持两棵树;一个是a == b,另一个是!= b。对于大多数函数,您可能需要调用两个树,但这将最终成为相同的大O复杂度,因为2 * O(log n) - > O(log n)。