避免堆栈溢出并提高Haskell的性能

时间:2015-02-16 09:52:08

标签: algorithm haskell tree monads tarjans-algorithm

a我正在尝试在树上实现一些算法,其中一个步骤是找到节点处理的发现和完成时间(类似于Tarjan的SSC),这是通过全局时间状态完成的。我在Haskell中使用由列表和计时器组成的状态monad。然而,在较大的树上,我会在这部分代码上出现堆栈溢出和性能下降的问题,你能提出改进的建议吗?

data DfsState = DfsState { timer :: Int
                         , treel :: [(Int, Int, Int)]
                         }

incTimer state = state { timer = timer state + 1 }
addElem node discovery finish state = state { treel=(node,discovery,finish):treel state }

dfs :: Node -> Node -> State DfsState ()
dfs node parent = do
    modify incTimer
    discovery <- gets timer
    mapM_ (flip dfs node) . filter (/= parent) $ graph M.! node
    finish <- gets timer
    modify (addElem node discovery (finish + 1))

0 个答案:

没有答案