我正试图获得两套联盟。基本上是二叉树(但不保证平衡)。这是代码:
class MyNonEmptySet extends MySet{
union(that: MyNonEmptySet): MySet = {
((left union right) union that) incl elem
}
}
class MyEmptySet extends MySet{
union(that: MyNonEmptySet): MySet = that
}
对于较小的数据集,联合可以正常工作,但是当数据较大时,联合不会返回。它继续下去。我想了解出了什么问题。如果它没有返回它应该至少耗尽内存(堆栈溢出异常),对吧?我怎么能纠正这个?
#EDIT1
如果我在NonEmptySet
的实现中更改了paranthesis,那么它是有效的。
(left union (right union that)) incl elem
我不明白为什么?两者都应该给出相同的结果吗?为什么一种方法需要永远(但不会耗尽内存)而另一种方法可以立即用于相同的数据?
答案 0 :(得分:0)
二叉树是一个好的数据结构的原因是它被排序,因此你可以在log n时间进行快速搜索。
看起来你没有使用排序的二叉树。
您的第二个算法有效但所有工作都由
完成incl elem
这很慢。
第一个算法有一个递归步骤,它正在进行自身的并集,但它永远不会离开递归步骤。
Scala中有很好的树集算法,我只想使用其中一种算法。
合并二叉树的正确方法是使用红黑树,但这不重要: https://www.wikiwand.com/en/Red%E2%80%93black_tree