如何找到两条路径的相同边?

时间:2016-02-05 15:20:10

标签: graph-algorithm

路径由包含节点ID的向量表示。路径中的边缘有方向。

给出两条路径,例如:< 1,6,11,7,2,5 ...>和< 3,4,8,2,7,3,1,6 ......>,这里< 1,6>是一样的优势。有时边缘是连续的,有时则不是。在这些边缘之间放置一个标志会更好。例如, (1,2)*(5,7,9)*(6,11,12),是相同的边缘1-> 2,5-> 7,7-> 9,6-> 11,11 - > 12,但没有2到5或9到6的边。所以放一个' *'或其他符号作为旗帜。

有没有人有想法?我将不胜感激。

2 个答案:

答案 0 :(得分:2)

假设每个节点只有一个传入边缘和一个传出边缘。 将P1称为长度为n的第一条路径,将P2称为长度为m的第二条路径。您可以将P2转换为哈希地图startEdge -> endEdge(例如<3,4,5>将成为[3->4, 4->5])。

然后,对于P1的每个元素,比如数字i,您将P1(i+1)Hashmap(key= P1(i))进行比较。如果hashmap没有密钥或者没有密钥但是具有不同的值,那么你就没有共同的优势,否则你就会有。

(如果一个节点有多个边,则hashmap的值可以是Ints集,您可以检查P1(i+1)中是否包含Hashmap(key=P1(i))。)

答案 1 :(得分:1)

以下是Clojure中的示例解决方案:

(defn same-edges [& paths]
  (->> paths
       (map (comp set (partial partition 2 1)))
       (apply clojure.set/intersection)))

因此,对于每个路径(map超过所有paths),您partition进入双元素子路径的路径(使用步长1获取所有相邻项目对) ,然后计算从该分区获得的所有唯一对的set。然后你会找到所有这些集合的intersection

示例:

(same-edges [1 6 11 7 2 5] [3 4 8 2 7 3 1 6])
;=> #{(1 6)}

换句话说,由向量[1 6 11 7 2 5][3 4 8 2 7 3 1 6]表示的两条路径之间的共享边集只包含一个项:对(1 6)