Algorithm 在OCaml中实现Dijkstra算法时遇到问题
我试图在OCaml中实现Dijkstra的算法,下面是伪代码: 到目前为止,我已经编写了这些函数,把所有的东西都放进去太长了,在这一点上可能没有必要。但我会给他们的类型Algorithm 在OCaml中实现Dijkstra算法时遇到问题,algorithm,list,dictionary,ocaml,dijkstra,Algorithm,List,Dictionary,Ocaml,Dijkstra,我试图在OCaml中实现Dijkstra的算法,下面是伪代码: 到目前为止,我已经编写了这些函数,把所有的东西都放进去太长了,在这一点上可能没有必要。但我会给他们的类型 (* init_dist build the distances (distance Map) between the nodes given a nodes list. *) let init_dist nodes source val init_dist : node list -> node -> float
(* init_dist build the distances (distance Map) between the nodes given a nodes list. *)
let init_dist nodes source
val init_dist : node list -> node -> float DistMap.t = <fun>
(* min_elt_and_key return a (node,float) tuple, by finding the minimum key and returning its key with it. *)
let min_elt_and_key map ~compare_element
val min_elt_and_key : 'a DistMap.t -> compare_element:('a -> 'a -> int) -> node * 'a = <fun>
(* update_distances updates dMap and prevMap based on n1 and n2, returns a tuple of Map *)
let update_distances n1 n2 dMap prevMap
(* find_minimum returns the minimum node based on the distance map. *)
let find_minimum nodes_Q first_node map
val find_minimum : node list -> node -> float DistMap.t -> node = <fun>
(Graph.nodes
具有类型节点列表
)
我的问题是,我不知道如何通过遍历nodes_Q,删除它,然后继续查找最小值。循环在OCaml中有unit
类型,因此在这里执行命令式编程将很难,而且最终目标是返回一个map元组(dist和prev)。另外还会出现另一个问题,我如何为中的for
循环编写代码?我基本上编写了编写算法所需的所有函数,但是组装它们并不是一件容易的任务
我看到了这个链接:
然而,几个月前我才开始用OCaml编码,我的数据结构似乎与我的数据结构大不相同
你会推荐我什么来实现这一目标
谢谢。在函数式语言中思考命令式循环的方法是将循环体重新想象为函数。循环中操纵的任何值都是函数的参数。为了进行循环的下一次迭代,函数使用新的参数值递归地调用自己
在您的案例中操纵的值是Q、dist和prev。因此,您可以将伪代码中的最后一个循环想象成这样:
let rec dijkstra_aux q dist prev =
if empty q then
(dist, prev)
else
let min_elt = smallest_element_of q in
let q' = remove_element q min_elt in
let (dist', prev') = update_neighbors q dist prev in
dijkstra_aux q' dist' prev'
感兴趣的:RosettaCode Dijkstra的算法谢谢。不过,我不会撒谎,我已经看到了这个链接,但几个月前我才开始使用OCaml,我的数据结构似乎与示例中的数据结构有很大不同。这就是为什么它作为注释而不是答案给出的原因。它没有帮助你学习,它只是给出了答案。很高兴你解释了为什么,你应该注意这个链接,为什么你不想把它作为问题答案的一部分,因为很多人不看评论。
let rec dijkstra_aux q dist prev =
if empty q then
(dist, prev)
else
let min_elt = smallest_element_of q in
let q' = remove_element q min_elt in
let (dist', prev') = update_neighbors q dist prev in
dijkstra_aux q' dist' prev'