以下(非最佳)代碼爲特定子集生成大小爲N的所有子集。Haskell中所有大小爲N的子集的快速獲取
此代碼有效,但正如我所說的,它非常不理想。使用中間列表來避免Set.insert的O(log(n))似乎沒有幫助,因爲之後將列表重新轉換爲集合的代價很大。設置
任何人都可以建議如何優化代碼嗎?
import qualified Data.Set as Set
subsetsOfSizeN :: Ord a => Int -> Set.Set a -> Set.Set (Set.Set a)
subsetsOfSizeN n s
| Set.size s < n || n < 0 = error "subsetOfSizeN: wrong parameters"
| otherwise = doSubsetsOfSizeN n s
where doSubsetsOfSizeN n s
| n == 0 = Set.singleton Set.empty
| Set.size s == n = Set.singleton s
| otherwise =
case Set.minView s of
Nothing -> Set.empty
Just (firstS, restS) ->
let partialN n = doSubsetsOfSizeN n restS in
Set.map (Set.insert firstS) (partialN (n-1)) `Set.union` partialN n
是否有'(:) [U] L''而不僅僅是'[U]一個特別的原因:L''? (同樣,在'l''的定義中'(++)'和'(:)')。 – huon
是的,我更喜歡使用這種形式,因爲我可以在where子句中寫cons = uncurry ),concat = uncurry(++),並在cons [u] l替換[u]:l'後。 – zurgl