performance - collat​​zチェーンのパフォーマンスの問題

performance haskell

私は与えられた範囲で最も長いcollat​​zチェーンを計算するための実用的なプログラムを持っています(プロジェクトオイラーn°14)。正常に動作すると思いますが、非常に遅いです。私はより良い解決策を探そうとしましたが、評価されたドメインを少ししか減らすことができません。私は何か間違ったことをしていますか?

実装ではメモ化を使用して、同じ結果を2回計算することを回避しています。 Data.Mapは一般的なパフォーマンスに悪影響を及ぼしますか?

import Data.Map ((!), member, insert, singleton, assocs, Map)

insertSolution::Integer->(Map Integer Integer)->(Map Integer Integer)
insertSolution n syracMap
    | n `member` syracMap = syracMap
    |otherwise = let
        next = if n `mod` 2 == 0 then n `div` 2 else 3 * n + 1
        newMap = insertSolution next syracMap
        solution = newMap ! next + 1
        in insert n solution newMap

bound = 1::Integer
lower = 999999::Integer

test::[Integer]
test = [lower,lower+2..bound]

values = takeWhile (\(k, v) -> k < bound) $ assocs $ foldr insertSolution (singleton 1 1) test

result = foldr (\(k, v) (k', v') -> if v > v' then (k, v) else (k', v')) (1, 1) values

main = putStr $ show $ result


編集する

バグを削除する機能を更新しました。私のラップトップではまだかなり遅いです。
答え
FWIW、これが私の解決策です:

module Main
    where

import Data.List
import Data.Ord

next_hailstone n | even n = n `div` 2
                 | otherwise = 3*n+1

gen_next_hailstone n
    = if nh == 1
      then Nothing
      else Just (nh, nh)
          where nh = next_hailstone n

hailstone n = unfoldr gen_next_hailstone n

hailstone_seqs = map hailstone [1..1000000]

zip_hailstone = zip [1..1000000] hailstone_seqs

max_hailstone = maximumBy (comparing (length . snd)) zip_hailstone

main = print . fst $ max_hailstone


比較的高速です。もっと速くしたいなら、consult the Haskell wiki(SPOILER ALERT !!!)。
関連記事

javascript - HTML /パフォーマンス:大規模な動的DOM挿入の処理

.net - デバッグモードでの実行が遅くなる原因は何ですか?

objective-c - NSImageViewを使用して複数の画像を連続して表示する

python - Googleアプリエンジン-ユーザー、リスト、製品の効率に関する参加質問

linq - Linqのパフォーマンス:どのクエリが高速か

performance - すべてのリクエストでRails3ロードモデルスキーマ

.net - .NETアプリケーションのパフォーマンスを測定する方法

ruby-on-rails - データベースデータを取得するファインダーメソッドのパフォーマンス

performance - Tomcatの前にApacheをインストールしますが、利点は何ですか?

html - IEでの印刷が非常に遅いWebページ