2011-10-07 32 views

回答

6

在内部,集合被表示为平衡树(可以是check the source online)。在计算集合并集时,算法根据较大集合(树)根的值将较小集合(树)分割成一组较小和一组较大元素。拆分总是在较小的集合上执行,以减少工作量。然后递归地组合左边和右边的两个子集并执行一些重新平滑处理。

总结是,该算法并不真正依赖哪些集合是第一个,哪些是第二个参数。它总是会根据设置的大小(它被存储为数据结构的一部分)选择更好的选项。

+0

“分割总是在较小的组上执行,以减少工作量”。 FWIW,OCaml的Set.union分裂更大的集合,并且比F#快得多。事实上,计算OCaml中的O(log n)和F#中的O(n)中的非重叠集合的并集,因为这一点。 –

0

任何你想要做的。你也可以用small + largelarge - small来区别(当然还有small - large)。

1

当您使用Set.union时,通过利用此功能实现的未记录功能,您的问题背后的意图似乎可以提高性能。但是Set.union从实现复杂性摘要只留下​​集合论意义联盟操作是不可知论者到参数属性。纯粹突破这个抽象层会对代码的复杂性和可维护性产生不利影响,应该避免。

虽然有时你别无选择,只能处理leaky abstractions,Set.union绝对不是这种情况。 hear from TomasSet.union实施没有泄漏抽象缺陷是好的。