ちょうど最近、私は基本的にオンラインゲームからシンプルなシステムをシミュレートするプログラムを書こうとしました。その背後にあるアイデアは、セットから最も可能性の高い統計効率のために、最も効率的なアイテムのセットをプログラムに計算させることです。これをもう少し明確にするために: あなたは8つのアイテムスロットと74の異なるアイテムを持っています。どのアイテムも2回使用することはできません。また、どのアイテムがどのスロットにあるかは関係ありません。私はまだ1つの統計情報を計算しようとしていません、私は先に立ち往生しています!ハスケル:大きなコンビナトリアルリストを扱うには?
したがって、この問題は、フィルタリングする前に(74^8)、フィルタした後に(74を8つ選択する)可能性の数です。 私が頭を試してみると、私のプログラムは遅れて始まります(permu '2)。 私はHaskellが無限リストを扱うことになっていることを知っているので、899兆件のリストのリストとはどのように動作しますか?よくわかっていますが、それはPCに多大な容量を必要とすることは明らかですが、私はここで質問しています。
ハスケルで大きなリストを扱うにはどうすればいいですか?このような
機能簡素化ルックス:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort [a] = [a]
quicksort (x:xs) = (quicksort [y | y <- xs, y <= x]) ++ [x] ++ (quicksort [z | z <- xs , z > x])
eliminatedouble [] = []
eliminatedouble (x:xs) = if x `elem` xs then eliminatedouble xs else x:(eliminatedouble xs)
permu' n | n>8 = error "8 is max"
| otherwise = eliminatedouble (filter allSatisfied (generate n))
where
generate 0 = [[]]
generate x = [quicksort (a:xs) | a <- [1..74], xs <- generate (x-1)]
allSatisfied [] = True
allSatisfied (x:xs) = (checkConstraint x xs) && (allSatisfied xs)
checkConstraint x xs = not (doubled x xs)
doubled x xs = x `elem` xs
はすべて、このように安価を行う方法を知って興味深いものになるだろう。
ありがとうございます。
今後の参考になるには、 'quicksort' - >' Data.List.sort'; 'eliminateouble' - >' Data.List.nub'です。 'elem'の' doubled'エイリアスは奇妙に見えます。また、 'nub'は一般的に' Data.Set'ベースの実装に比べてかなり遅く、 'allSatisfied'も' Data.Set'を使って多くのスピードを出すでしょう。しかし、私の答えに記載されているように、最大の勝利は気にしないで、フィルタリングするたくさんのものを生成するのではなく、最初に気にかけている要素を生成することから来ます。 –