路径由包含节点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的边。所以放一个' *'或其他符号作为旗帜。
有没有人有想法?我将不胜感激。
答案 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)
。