如果我知道其中一个会比另一个更大,是否有任何推荐的方法可以调用Set.union?F#Set.union自变量顺序执行
Set.union large small
或
Set.union small large
感谢
如果我知道其中一个会比另一个更大,是否有任何推荐的方法可以调用Set.union?F#Set.union自变量顺序执行
Set.union large small
或
Set.union small large
感谢
在内部,集合被表示为平衡树(可以是check the source online)。在计算集合并集时,算法根据较大集合(树)根的值将较小集合(树)分割成一组较小和一组较大元素。拆分总是在较小的集合上执行,以减少工作量。然后递归地组合左边和右边的两个子集并执行一些重新平滑处理。
总结是,该算法并不真正依赖哪些集合是第一个,哪些是第二个参数。它总是会根据设置的大小(它被存储为数据结构的一部分)选择更好的选项。
任何你想要做的。你也可以用small + large
和large - small
来区别(当然还有small - large
)。
当您使用Set.union
时,通过利用此功能实现的未记录功能,您的问题背后的意图似乎可以提高性能。但是Set.union
从实现复杂性摘要只留下集合论意义联盟操作是不可知论者到参数属性。纯粹突破这个抽象层会对代码的复杂性和可维护性产生不利影响,应该避免。
虽然有时你别无选择,只能处理leaky abstractions,Set.union
绝对不是这种情况。 hear from TomasSet.union
实施没有泄漏抽象缺陷是好的。
“分割总是在较小的组上执行,以减少工作量”。 FWIW,OCaml的Set.union分裂更大的集合,并且比F#快得多。事实上,计算OCaml中的O(log n)和F#中的O(n)中的非重叠集合的并集,因为这一点。 –