【发布时间】:2017-02-06 00:16:52
【问题描述】:
由于不知道如何在 Haskell 中编写 DFS,我已经摸索了几个小时。
我的图被实现为邻接列表,其中键(或图的节点名称)是列表索引:
0 -> 1
1 -> 0, 2
2 -> 1
As a Haskell list: [[1],[0,2],[1]]
到目前为止,这是我的 DFS 代码:
dfs graph visited node = helper graph visited (graph !! node) node
where helper _ _ visited [] _ = visited
helper graph visited (x:xs) currNode
| elem x visited = helper graph visited xs currNode
| otherwise = dfs graph (currNode:visited) x
我了解问题在于,一旦到达图表的一端,它就不会回溯并尝试另一个相邻节点。我一直在尝试修改守卫的其他部分以尝试修复它,但似乎无法提出可行的方法。我该怎么做才能解决这个问题?
【问题讨论】:
-
这还能编译吗?在最坏的情况下,
!!的复杂度也是 O(n),所以你的 dfs 的复杂度会更大。 -
如果这不是家庭作业,您可能想要使用功能图形库 (fgl)。大量模块看起来令人生畏,但实际上很容易使用。
-
这对于答案来说太少了,但请看一下这篇论文:“Structuring Depth-First Search Algorithm in Haskell” www.researchgate.net/publication/2252048_Structuring_Depth-First_Search_Algorithms_in_Haskell/file/50463523c7a64b12d4.pdf – 这不是最容易掌握的,但是……嗯,应该表现得很好。稍后我会进行测试。
标签: haskell depth-first-search