【问题标题】:graph in SML of NJ新泽西州 SML 中的图表
【发布时间】:2011-05-17 07:10:46
【问题描述】:

我需要使用 ML 编写一些函数,该函数接收 有向[(1,2),(1,3),(3, 2)],表示从 1 到 2 和从 1 到 3 的有向边...,我还收到两个顶点,我需要找到从第一个顶点到第二个顶点的所有可能方式以及可能路径的列表,例如对于顶点1, 2,我需要显示列表[[1,2],[1,3,2]],我该怎么做ML 如果无法存储有关顶点的数据,请提前感谢您的任何想法。

【问题讨论】:

  • 不能存储数据是什么意思?它可以读取您的数据并进行处理。你都尝试了些什么?如果您假设(目前)数据在 ML 数据结构中可用,您打算如何计算路径?

标签: algorithm sml smlnj


【解决方案1】:

您可以存储有关顶点的数据!

例如,你想记录你访问过的顶点吗?

假设您有一个函数,它从当前顶点递归地探索所有可能的未探索边。

它可以接受未探索边的向量,加上当前顶点和目标顶点。它将返回一个成功到达目标顶点的路径向量。

在内部,它将定位从该顶点开始的边集,并针对该集中的每条边递归到自身,从未探索边列表中删除所选边到每个子函数中。

【讨论】:

  • 你能解释得更准确吗?
【解决方案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 *)

要实现此签名,您可以考虑一个简单的vertex * 'a 对列表,或者更雄心勃勃的东西,例如平衡二叉搜索树。

【讨论】:

  • 我是 ML 世界的初学者,所以理解你的签名有点困难:(
【解决方案3】:

对不起,我忍不住

我在Yahoo! Answers 上看到了同样的谜题(呃问题)弹出窗口,我 回答了。

实施最初是基于创建树的设计 遍历图;但它最终与设计相匹配 早前由Alex Brown表达。

最初是planning was done in Haskell,因此这个辅助函数:

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 

以上代码来自routes4.sml; 但是省略了测试和IO。虽然时间不长,但还是很期待 它可以更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2011-09-16
    • 1970-01-01
    • 2023-03-20
    • 2016-06-16
    • 2015-09-07
    • 2012-05-11
    相关资源
    最近更新 更多