当前位置: 首页 > 面试题库 >

如何在图形中搜索路径?

齐晟
2023-03-14
问题内容

说我有一个边列表,每个边包含两个节点(到和从)。找到两个给定节点的边缘的最佳方法是什么?请注意,边缘的节点可能会重复。

假设我在这种格式下具有优势:

1 <-> 5

3 <-> 7

5 <-> 6

2 <-> 6

然后,诸如1 5的查询将返回 true

然后,诸如5 2之类的查询将返回 true, 因为5连接6并且6连接至2。

然后,诸如1 7的查询将返回 false

然后,诸如7 4之类的查询将返回 false, 因为4不存在,这意味着它是无边节点。


问题答案:

在我看来,您只是在询问无向图中两个顶点之间是否存在路径,但不一定是该路径可能是什么。这与询问两个顶点是否在图形的相同连接组件中相同。

如果您确实只需要知道两个顶点是否在相同的连接组件中,则可以使用不相交集数据结构来简单高效地执行算法。

initialize the disjoint set structure (DSS)
for each edge:
  for each vertex in edge:
    if the vertex does not exist in the DSS:
      create a new subset in the DSS containing only the vertex
  merge the subsets of the two vertices

要确定在处理完所有边后两个顶点之间是否存在路径,只需检查两个顶点是否在同一子集中。如果它们是,则它们之间存在一些路径。

使用DSS的有效实现,该算法的效果仅比线性时间差一点,即使使用简单的DSS链表实现,它的O(n *log(n))也是如此。正如j
_随机_黑客提到的那样,无论是否仅计算传递闭包,Floyd-Warshall的存储时间均为O(n ^ 3)和O(n ^
2),并且使用Dijkstra的算法需要O(n *log(n) )计算每个查询。



 类似资料:
  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 回到Jooq2.5,看起来可以通过FactoryOperations类设置PostgreSQL搜索路径,但Jooq3.5中没有该类。显然,FactoryOperations分为DSL和DSLContext,但我似乎找不到use(Schema)方法的结尾。如何在较新版本的jOOQ中设置PostgreSQL搜索路径?

  • VSCode中是否有任何与CTRL R类似的功能?

  • 我正在使用Mongoostic,它工作得很好,但我面临的问题是,如何从方法并将其传递给方法? 例如: 你们是怎么解决这个问题的?这是一个非常基本的搜索,用户搜索时,它会将用户重定向到另一个页面,在那里它要么显示已找到的结果,要么未找到。

  • > Eclipse 具有此功能,您可以在其中搜索文件夹中的任何文件。PhpStorm 中是否有这样的功能? 是否有缩进的快捷方式,如何自定义? 谷歌了一下,但没有结果。

  • 使项目变形 “变形”命令允许您拖动控制点以变换图像的形状、形状或路径等。也可以使用选项栏中“变形样式”弹出式菜单中的形状进行变形。“变形样式”弹出式菜单中的形状也是可延展的;可拖动它们的控制点。 当使用控制点来扭曲项目时,选取“视图”>“显示额外内容”可显示或隐藏变形网格和控制点。 使用变形 A. 选择要变形的形状 B. 从选项栏中的“变形样式”弹出式菜单中选取一种变形 C. 使用几个变形选项获得