【发布时间】:2016-08-26 08:04:39
【问题描述】:
在一个有 V 个顶点和 E 个边的无向图中,你将如何计算 O(|V||E|) 中的三角形数量?我看到了算法here,但我不确定如何实现该算法以实现这种复杂性。这是该帖子中提供的代码:
for each edge (u, v):
for each vertex w:
if (v, w) is an edge and (w, u) is an edge:
return true
return false
您会使用图的邻接表表示来遍历外循环中的所有边,然后使用邻接矩阵来检查内循环中是否存在 2 条边?
另外,我看到了另一种解决方案,表示为 O(|V||E|),它涉及在图上执行深度优先搜索,当你遇到来自顶点 u 的后边 (u,v) 时,你就是访问检查顶点 u 的祖父母是否是顶点 v。如果是,那么您找到了一个三角形。这个算法正确吗?如果是这样,这不是 O(|V|+|E|) 吗?在我链接到的帖子中,有一个针对所提供的广度优先搜索解决方案的反例,但根据我提出的示例,我上面概述的深度优先搜索方法似乎有效。
【问题讨论】:
-
如果你有图的邻接表实现,迭代所有边是
for (Vertex v : graph) { for (Edge e : v.Edges()) { /* do something with e */ } }。像这样的迭代是O(V+E),这将使算法在O(|V|^2 + |V||E|)中运行。或者,您可以预处理图形并生成包含所有边的集合。 -
您指的是我在上面发布的代码吗?如果是这样,您是否从构造邻接矩阵中得到 O(|V|^2),而从访问每个边和顶点组合中得到 O(|V||E|)?
标签: algorithm data-structures graph