我有,我已表示为Map<Node, Collection<Node>>
(在Java中发言,或f(Node n) -> Collection[Node]
作为函数依赖图的可达性;这是从一个给定节点n
到节点的集合依赖的映射在n
)。该图可能是循环*。图算法:从邻接地图
给定一个列表中的节点的badlist
,我想解决reachability problem:即产生一Map<Node, Set<Node>> badmap
表示从每个节点N的列表badlist
到一组节点,其中包括N或其他节点的是传递地依赖于映射它。
实施例:
(x -> y means node y depends on node x)
n1 -> n2
n2 -> n3
n3 -> n1
n3 -> n5
n4 -> n2
n4 -> n5
n6 -> n1
n7 -> n1
这可以被表示为邻接地图{n1: [n2], n2: [n3], n3: [n1, n5], n4: [n2, n5], n6: [n1], n7: [n1]}
。
如果badlist = [n4, n5, n1]
那么我期望得到badmap = {n4: [n4, n2, n3, n1, n5], n5: [n5], n1: [n1, n2, n3, n5]}
。
我在网上发现图算法参考,所以如果任何人都可以指出我有效的可达性算法描述,我会很感激。 (某事的一个例子是不对我很有帮助,是http://www.cs.fit.edu/~wds/classes/cse5081/reach/reach.html,因为该算法是确定一个特定的节点A是否是从一个特定节点B可到达)
*循环:如果你好奇,这是因为它代表C/C++类型,并且结构可以具有指向正在讨论的结构的成员。
好的,这很简单。出于某种原因,我挂断了一个事实,即必须重新执行'for root in badlist'循环,而没有利用以前执行循环所获得的知识。所以也许可以优化速度......但是你拥有的很简单。 –
@Jason这对于有界的入度(即结构引用的不同结构类型的数量)的图是渐近最优的。如果瓶颈不在其他地方,我会感到惊讶。 – quaint
@Jason:如果您想优化该算法的速度,请将标记位置于顶点本身,而不是在外部'visited'集合中查找它。 –