路径由包含节点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之间的边。所以把'*‘或其他符号作为标志。
有人有什么想法吗?我会很感激的。
发布于 2016-02-05 15:33:13
假设每个节点只有一个输入边缘和一个输出边缘。将P1称为长度为n的第一条路径,P2为长度为m的第二条路径。您可以将P2转换为hashmap 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))中)。
发布于 2016-02-05 15:39:10
下面是克洛尔中的一个示例解决方案
(defn same-edges [& paths]
(->> paths
(map (comp set (partial partition 2 1)))
(apply clojure.set/intersection)))因此,对于每个路径(map在所有paths上),将路径划分为2元素子路径(使用步骤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)。
https://stackoverflow.com/questions/35227583
复制相似问题