【发布时间】:2019-04-07 14:51:19
【问题描述】:
我正在使用邻接表来表示 OCaml 中的图形。然后我从节点s开始在OCaml中实现了以下BFS。
let bfs graph s=
let size = Array.length graph in
let seen = Array.make size false and next = [s] in
let rec aux = function
|[] -> ()
|t::q -> if not seen.(t) then begin seen.(t) <- true; aux (q@graph.(t)) end else aux q
in aux next
size表示图的节点数。 seen 是一个数组,其中seen.(t) = true 如果我们看到了节点t,next 是我们需要看到的节点的列表。
问题是 BFS 的时间复杂度通常是线性的 (O(V +E)) 但我觉得我的实现没有这种复杂度。如果我没记错的话,q@graph.(t) 的复杂性相当大,因为它是 O(| q |)。所以我的复杂性非常糟糕,因为在每一步我都在连接两个列表,而且时间很长。
因此,我想知道如何调整此代码以制作高效的 BFS?问题(我认为)来自使用列表的队列实现。 OCaml 中 Queue 模块的复杂性是否需要 O(1) 才能添加元素?在这种情况下,我如何使用这个模块来使我的 bfs 工作,因为我不能像列表一样轻松地使用 Queue 进行模式匹配?
【问题讨论】:
标签: time-complexity ocaml breadth-first-search