如果我知道其中一個會比另一個更大,是否有任何推薦的方法可以調用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)中的非重疊集合的並集,因爲這一點。 –