私は次の問題に直面しています:
初期セットから、[1,2,3,4]
すべての可能なサブセットを計算します。[[1],[2],[3],[4],[1,2],[1,3],[1,4],[2,3],[2,4],[3,4],[1,2,3],[1,2,4],[1,3,4],[2,3,4],[1,2,3,4]]
私generate.hs
は正しい次の Haskell プログラムを書きました。
generateSets :: Eq a => [a] -> [[a]] -> [[a]] -> [[a]]
generateSets [] _ _ = []
generateSets src [] _ = let isets = growthup [] src in generateSets src iset iset
generateSets src sets rsets = if null sets' then rsets else generateSets src sets' (rsets++sets')
where sets' = concatMap (flip growthup src) sets
growthup :: (Eq a) => [a] -> [a] -> [[a]]
growthup ps ss = map (\suf -> ps++[suf]) ss'
where ss' = nextoccurence ps ss
nextoccurence :: (Eq a) => [a] -> [a] -> [a]
nextoccurence [] ys = ys
nextoccurence xs ys = tail ys'
where ys' = dropWhile (/= last xs) ys
GHCインタプリタghciで実行中...
ghci> generate [1,2,3,4] [] []
ghci> [[1],[2],[3],[4],[1,2],[1,3],[1,4],[2,3],[2,4],[3,4],[1,2,3],[1,2,4],[1,3,4],[2,3,4],[1,2,3,4]]
すべてがうまくいきますが、たとえばサイズ 30 の小さなセットではプログラムに時間がかかりすぎます。
私の質問は: Haskell の怠惰、またはガベージ コレクターなどからより多くを得るためにコードを改善することは可能ですか?
私のコードは並列処理に適していますか?
返信ありがとうございます。