0

a我正在尝试在树上实现一些算法,其中一个步骤是找到节点处理的发现和完成时间(类似于 Tarjan 的 SSC),这是通过全局时间状态完成的。我在 Haskell 中使用由列表和计时器组成的 State 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))
4

0 回答 0