在节点之间的图表中查找距离

时间:2014-03-24 13:46:33

标签: haskell distance

我手里拿着一份清单:

[(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]

我必须实现一个功能,该功能包括:现有关系列表一对新现实距离n。 < / p>

函数应该以这种方式工作:它接受所有参数,计算以新关系给出的节点之间的距离,如果距离<=距离n,则函数返回包含新关系的列表。

例如:

list = [(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]

new_relation = [(1,3)]

distance_n = 4

它将返回[(1,2),(1,3),(1,4),(2,4),(3,9),(4,7), (7,9)]

如果距离为3,则会返回原始列表

[(1,2),(1,4),(2,4),(3,9),(4,7),(7,9)]

我怎么能这样做?我的图表有问题。 注意:它应该在Haskell中实现。

2 个答案:

答案 0 :(得分:1)

与Haskell一样,我们首先声明我们的类型。这里&#39;我只想说GraphEdge的列表,而EdgeNode的元组,它们只是Int 1}}š

type Node = Int
type Edge = (Int, Int)
type Graph = [Edge]

然后我们可以宣布我们的功能&#39;类型。首先,我们有一个解决特定问题的函数

addNode :: Graph -> Edge -> Int -> Graph
addNode graph newEdge maxDistance = undefined

但是我们从问题陈述中知道我们需要一个帮助器,即一个计算两个节点之间距离的函数(如果节点没有连接,则可以是未定义的)。由于这并不总是有一个有效的返回值,我们会将其打包在Maybe中,并在节点未连接时返回Nothing

distance :: Graph -> Node -> Node -> Maybe Int
distance graph fromNode toNode = undefined

有了这个辅助函数,我们现在可以非常简单地实现addNode

addNode graph newEdge@(fromNode, toNode) maxDistance =
    case distance graph fromNode toNode of
        Nothing -> graph
        Just d  ->
            if d <= maxDistance
                then newEdge : graph
                else graph

但看起来您希望对图表进行排序,因此如果您导入Data.List,则只需投放sort

addNode graph newEdge@(fromNode, toNode) maxDistance =
    case distance graph fromNode toNode of
        Nothing -> graph
        Just d  ->
            if d <= maxDistance
                then sort $ newEdge : graph
                else graph

现在你所要做的就是实施distance,你就完成了。

答案 1 :(得分:1)

the containers packagethe graphs package都有与您相似的邻接列表表示。

A Very General Method of Computing Shortest Paths包含用于查找图形距离的Djikstra算法的功能实现,但它适用于邻接矩阵。更改表示或更改算法以处理邻接列表。

实际上有一个函数距离:: Graph - &gt;顶点 - &gt;顶点 - &gt;距离和功能addEdge :: Edge - &gt;图 - &gt;图,你是金色的。 addEdge应该相对容易编写而不依赖于表示,但通常添加边缘意味着你必须丢弃任何先前的缓存距离计算。