以下(不太优化的)代码生成了某个子集大小为N的所有子集。
这段代码虽然可用,但是如我所说,非常不优化。使用中间列表来避免Set.insert的O(log(n))似乎没有帮助,因为后面将列表重新转换为Set的成本很大。
有人能建议如何优化代码吗?
这段代码虽然可用,但是如我所说,非常不优化。使用中间列表来避免Set.insert的O(log(n))似乎没有帮助,因为后面将列表重新转换为Set的成本很大。
有人能建议如何优化代码吗?
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