任何帮助都将不胜感激。
答案 0 :(得分:2)
您可以在线性时间内交叉任意两个排序列表。
这在O(n1 + n2)中运行,对于并集操作(您受输出大小限制)是最佳的。
或者,您可以查看较小树的所有元素,以查看它们是否存在于较大的树中。这在O(n1 log n2)中运行。
这是Google在其BigTable引擎中使用(或考虑使用)查找交叉点的算法:
在二叉树迭代器中查找元素或下一个最大元素:
对于完全混合的类似大小的集合,这衰减到O(n1 + n2),如果第二棵树大得多,则衰减到O(n1 log n2)。如果一个树中的子树的范围不与另一个树/所有其他树中的任何节点相交,则访问该子树中的最多一个元素(其最小值)。这可能是最快的算法。
答案 1 :(得分:0)
这是一篇论文,其中包含有效的算法,用于查找AVL树的交叉点和联合(或其他类型的树以及其他操作)。
Implementing Sets Efficiently in a Functional Language
当我研究这个主题时,我发现了这篇论文。算法在Haskell中,它们主要是为不可变树设计的,但它们也适用于任何类型的树(尽管在某些语言中可能会有一些开销)。它们的性能保证与上面给出的算法类似。