首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找到两条路径的相同边?

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

Stack Overflow用户
提问于 2016-02-05 15:20:10
回答 2查看 475关注 0票数 0

路径由包含节点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之间的边。所以把'*‘或其他符号作为标志。

有人有什么想法吗?我会很感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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))中)。

票数 2
EN

Stack Overflow用户

发布于 2016-02-05 15:39:10

下面是克洛尔中的一个示例解决方案

代码语言:javascript
运行
复制
(defn same-edges [& paths]
  (->> paths
       (map (comp set (partial partition 2 1)))
       (apply clojure.set/intersection)))

因此,对于每个路径(map在所有paths上),将路径划分为2元素子路径(使用步骤1获取所有相邻项对),然后计算从该分区获得的所有唯一对的set。然后找到所有这些集合的intersection

示例:

代码语言:javascript
运行
复制
(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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35227583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档