【问题标题】:How to traverse graph in haskell?如何在haskell中遍历图?
【发布时间】:2019-02-11 14:02:44
【问题描述】:

假设我有以下图表:

(graph, nodeFromVertex, vertexFromKey) = graphFromEdges [("a", 'a', ['b']), ("b", 'b', ['c']), ("c", 'c', []), ("d", 'd', ['b'])]

这是视觉效果:

我想要一种方法来找出没有任何出边的顶点。

在这种情况下它只是c

我假设找到它的方法是手动递归,直到找到没有连接的顶点。但我不确定如何在这里递归......

Haskell 图文档并没有真正说...

【问题讨论】:

    标签: haskell graph


    【解决方案1】:

    GraphArray Vertex [Vertex]。您可以使用Vertex(基于0Int 索引)对其进行索引,并获取后续顶点列表。你可以得到一个没有后继的顶点列表(假设Data.Array被导入):

    vs = [v | (v, []) <- Data.Array.assocs graph]
    

    此列表推导式选择具有空后继列表的元素的索引。

    可以使用nodeFromVertex函数将顶点映射到节点。

    【讨论】:

      【解决方案2】:

      您可以使用outdegree 获取所有顶点的出边数的数组:

      Prelude Data.Graph Data.Array> outdegree graph
      array (0,3) [(0,1),(1,1),(2,0),(3,1)]
      

      数组中每个元素的值是出边的数量。如果要过滤数组,可以把它变成关联列表:

      Prelude Data.Graph Data.Array> assocs $ outdegree graph
      [(0,1),(1,1),(2,0),(3,1)]
      

      然后过滤它。由于您对没有出边的顶点感兴趣,您可以过滤关联列表中的值(第二个元素)为0 的顶点:

      Prelude Data.Graph Data.Array> filter ((0 ==) . snd) $ assocs $ outdegree graph
      [(2,0)]
      

      如果您想要一个节点列表,您可以使用 nodeFromVertex 映射过滤后的关联列表:

      Prelude Data.Graph Data.Array> l = filter ((0 ==) . snd) $ assocs $ outdegree graph
      Prelude Data.Graph Data.Array> fmap (nodeFromVertex . fst) l
      [("c",'c',"")]
      

      【讨论】:

      • 嘿,马克,很确定有一种更正统的方法可以抓住你,但你能不能Maybe 试试这个 - stackoverflow.com/questions/71243589/… ?热切地awaiting 你的回复...
      • @Bondolin 事实上,我的 Stack Overflow 个人资料中有很多联系信息。 (看起来你已经对这个问题有了一些很好的回答。)
      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多