2011-10-07 34 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實施沒有泄漏抽象缺陷是好的。