Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在OCaml中实现Dijkstra算法时遇到问题_Algorithm_List_Dictionary_Ocaml_Dijkstra - Fatal编程技术网

Algorithm 在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

我试图在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 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'