【发布时间】:2014-11-04 21:49:08
【问题描述】:
我有一个作为邻接列表列表的有向图 G:
newtype Graph Int = Graph [(Int, [Int])]
G 有 n 个顶点和 m 个边。我正在尝试在 Haskell 中实现在 O(m) 时间内运行的 BFS 算法(可能已摊销),但我能够提出在 O(m * log n) 中运行并使用来自Data.Map 的数据结构的最佳解决方案模块。
我对线性解决方案的想法如下:使用来自 Data.Sequence 的结构作为高效的 FIFO 队列并按照命令式 BFS 执行所有操作,但我被困在必须将节点标记为已访问的点上。
我的问题是:是否可以在 O(m) 中运行的 Haskell(或任何其他纯函数式语言)中实现 BFS?如果不是,你可以用什么论据来证明这种说法?
【问题讨论】:
-
您是在问这样的算法是否可行,还是特别想在 Haskell 中实现它?
-
@ScottHunter:我在考虑任何纯粹的函数式语言(我编辑了我的问题)
-
您在实现
O(1)队列时遇到问题吗? -
结构树的惰性 BFS 队列是 easy(另见 this answer with the cycle detection)。
标签: algorithm haskell functional-programming