Algorithm NJ的SML图
我需要用ML写一些函数,这个函数接收有向图的边列表,它表示从1到2和从1到3的有向边,我还接收两个顶点,我需要找到从第一个顶点到第二个顶点的所有可能方式和可能路径的列表,例如,对于顶点1,2,我需要显示列表[[1,2],[1,3,2],如果无法存储有关顶点的数据,我该怎么做呢?提前感谢您的建议。您可以存储有关顶点的数据 例如,是否要记录访问过的顶点 假设您有一个函数,它递归地探索来自当前顶点的所有可能未探索的边 它可以接受未探测边的向量,加上当前顶点和目标顶点。它将返回成功到达目标顶点的路径向量Algorithm NJ的SML图,algorithm,sml,smlnj,Algorithm,Sml,Smlnj,我需要用ML写一些函数,这个函数接收有向图的边列表,它表示从1到2和从1到3的有向边,我还接收两个顶点,我需要找到从第一个顶点到第二个顶点的所有可能方式和可能路径的列表,例如,对于顶点1,2,我需要显示列表[[1,2],[1,3,2],如果无法存储有关顶点的数据,我该怎么做呢?提前感谢您的建议。您可以存储有关顶点的数据 例如,是否要记录访问过的顶点 假设您有一个函数,它递归地探索来自当前顶点的所有可能未探索的边 它可以接受未探测边的向量,加上当前顶点和目标顶点。它将返回成功到达目标顶点的路径向量
在内部,它将定位从该顶点开始的边集,并针对该集中的每条边递归到自身,将所选边从未探索边列表中删除到每个子函数中。您可以存储有关顶点的数据 例如,是否要记录访问过的顶点 假设您有一个函数,它递归地探索来自当前顶点的所有可能未探索的边 它可以接受未探测边的向量,加上当前顶点和目标顶点。它将返回成功到达目标顶点的路径向量
在内部,它将定位从该顶点开始的边集,并针对该集中的每条边递归到自身,将所选边从未探索边列表中删除到每个子函数中。如果要存储有关顶点的数据,则需要从垂直到数据的有限映射。 地图可能会提供如下签名:
type 'a vmap (* vertex map *)
val empty : 'a vmap (* empty map *)
val insert : vertex * 'a * 'a vmap -> 'a vmap (* add info about a vertex *)
val lookup : vertex * 'a vmap -> 'a option (* look for info about a vertex *)
为了实现这个签名,您可以考虑一个简单的列表:“代码>顶点*'A/COD>对,或者像平衡二叉搜索树那样更有野心。
< P>如果您想存储关于顶点的数据,则需要从垂直到数据的有限映射。 地图可能会提供如下签名:type 'a vmap (* vertex map *)
val empty : 'a vmap (* empty map *)
val insert : vertex * 'a * 'a vmap -> 'a vmap (* add info about a vertex *)
val lookup : vertex * 'a vmap -> 'a option (* look for info about a vertex *)
为了实现这个签名,你可以考虑一个简单的列表:<代码>顶点* 'A/COD>对,或者像平衡二叉搜索树那样更雄心勃勃的东西。 我在屏幕上看到同样的拼图(er问题),我 回答了
该实现一开始是一个基于创建树的设计 遍历图形;但它最终与设计相匹配 早些时候由 最初是辅助函数,因此使用此辅助函数:fun replicate len el =
if len = 0 then nil else el::replicate (len -1) el
主要实施:
fun routes dst (edges:(int * int) list) src =
let val (very_possible,remotely_possible) =
if null edges
then (nil,nil)
else List.partition ((fn s=> s = src) o #1) edges
val (raw_solutions,dsts_is_nx_srcs) =
List.partition ((fn d => d = dst) o #2) very_possible
val solutions = replicate (length raw_solutions) [src,dst]
val full_rest_routes =
let val rest_rest_routes =
map (routes dst remotely_possible)
( map #2 dsts_is_nx_srcs )
in map (fn lst => src::lst) (List.concat rest_rest_routes)
end
in case (very_possible, solutions, remotely_possible)
of (nil, _, _) => nil
| (_::_, (p::ps), _) => solutions @ full_rest_routes
| (_::_, nil, _::_) => full_rest_routes
| (_ , nil, nil ) => nil
end
用户界面:
fun getPaths edges src dst = routes dst edges src
以上代码来自:;
但省略了测试和IO。虽然时间不长,但我还是希望
这会更简单。对不起,我无法抗拒
我在屏幕上看到同样的拼图(er问题),我
回答了
该实现一开始是一个基于创建树的设计
遍历图形;但它最终与设计相匹配
早些时候由
最初是辅助函数,因此使用此辅助函数:
fun replicate len el =
if len = 0 then nil else el::replicate (len -1) el
主要实施:
fun routes dst (edges:(int * int) list) src =
let val (very_possible,remotely_possible) =
if null edges
then (nil,nil)
else List.partition ((fn s=> s = src) o #1) edges
val (raw_solutions,dsts_is_nx_srcs) =
List.partition ((fn d => d = dst) o #2) very_possible
val solutions = replicate (length raw_solutions) [src,dst]
val full_rest_routes =
let val rest_rest_routes =
map (routes dst remotely_possible)
( map #2 dsts_is_nx_srcs )
in map (fn lst => src::lst) (List.concat rest_rest_routes)
end
in case (very_possible, solutions, remotely_possible)
of (nil, _, _) => nil
| (_::_, (p::ps), _) => solutions @ full_rest_routes
| (_::_, nil, _::_) => full_rest_routes
| (_ , nil, nil ) => nil
end
用户界面:
fun getPaths edges src dst = routes dst edges src
以上代码来自:;
但省略了测试和IO。虽然时间不长,但我还是希望
它可以更简单。它不能存储数据是什么意思?它可以读取并处理您的数据。到目前为止你试过什么?如果(目前)假设数据在ML数据结构中可用,您打算如何计算路径?它不能存储数据是什么意思?它可以读取并处理您的数据。到目前为止你试过什么?如果您假设(目前)数据在ML数据结构中可用,您打算如何计算路径?您能更精确地解释吗?您能更精确地解释吗?我是ML领域的初学者,因此理解您的签名有点困难:(我是ML领域的初学者,所以理解您的签名有点困难:(