Algorithm 使用具有特定运行时间的算法在图形中查找三角形

Algorithm 使用具有特定运行时间的算法在图形中查找三角形,algorithm,graph,runtime,big-o,notation,Algorithm,Graph,Runtime,Big O,Notation,我需要找到一个在无向图中找到三角形圈的算法。算法的运行时间应为n^2,81 我真的不知道如何才能做到这一点。如果有人能帮忙,那就太好了 谢谢 您搜索的算法是矩阵乘法。 将邻接矩阵与自身相乘三次,并在主对角线中搜索非零中心。 矩阵乘法是O(N^2.81): 编辑: 回想一下,在邻接矩阵的第i行中,连接到i的每个顶点都有“1”,列也是如此 当你将矩阵与自身相乘时,(M^2)ij=sum(Mik*Mkj)。换句话说,(M^2)ij是从i到j的两条边路径的数目 现在如果你再乘以得到M^3,在每个单元格

我需要找到一个在无向图中找到三角形圈的算法。算法的运行时间应为n^2,81

我真的不知道如何才能做到这一点。如果有人能帮忙,那就太好了


谢谢

您搜索的算法是矩阵乘法。 将邻接矩阵与自身相乘三次,并在主对角线中搜索非零中心。 矩阵乘法是O(N^2.81):

编辑:

回想一下,在邻接矩阵的第i行中,连接到i的每个顶点都有“1”,列也是如此

当你将矩阵与自身相乘时,(M^2)ij=sum(Mik*Mkj)。换句话说,(M^2)ij是从i到j的两条边路径的数目


现在如果你再乘以得到M^3,在每个单元格(M^3)ij中,会有从i到j的三条边路径的数目。因此,在主对角线(M^3)ii中,将有从i到i的三条边路径的数量,一个三角形。

另一种方法是使用算法的修改版本。试着想象一个简单的图形,一个三角形。从具有BFS的任何顶点开始,存储父节点以及与根的距离。 每当遇到已访问(但未完成)的顶点时,可以将其简单地涂成灰色,必须检查距离和父顶点

   B     Start BFS from A: node A has dist=0, parent=Null
  / \                      node B has dist=1, parent=A
 /   \                     node C has dist=1, parent=A
A - - C
例如,您现在在C上,B已访问,A已完成(黑色),现在您检查C的相邻位置,看到B并检查距离是否相同,是否有相同的父项,如果为true,则找到三角形,如果不是,则遇到循环,但不是三角形

这将比
O(n^2)

该算法(BFS)的复杂度是顶点数+边数:
O(|V|+|E|)

你见过N.Alon、R.Yuster和U.Zwick发现和计算给定长度的循环吗?(Algorithmica(1997)17:209-223)没有,但谢谢你,我会读一读的!回答得很好-但我会详细说明解决方案(即使是简单的编码示例)有趣!我原以为这与斯特拉森的算法有关,但我不知道如何用它来找出问题的解决方案。我想我没有把矩阵和路径结合起来的背景知识。我该如何将路径转化为矩阵?@shuki avraham因此,如果我有图1--2--3--4,我会得到邻接矩阵01 01 01 01 01 01 01 01 01 0,我会使用Strassen将矩阵相乘三次,以节省运行时成本。然后通过最后一个矩阵,我将添加对角线,以确定形成了多少个三角形。这个数字不是太高了吗显然,我的示例不包括三角形;)我会把对角线的总和除以6,考虑到我在计算两个方向上的所有边和路径吗?到目前为止,这是正确的吗?@Jenniferagner是的,每个三角形都被计算6次,所以你需要除以6。请注意,此方法不会提供三角形列表,只提供数字。三角形的数量可能多达O(n^3),因此列出它们的速度无法加快。@JenniferMagner更正。这不起作用。只有当三角形的两条边在bfs树中时,您的方法才能找到三角形。可以有一个三角形,其两条边不在树中。考虑图:{(1,2),(1,3),(2,4),(2,5),(3,5),(3,6),(5,6)}。它的bfs树是{(1,2)、(1,3)、(2,4)、(2,5)、(3,6)}。图中唯一的三角形(3,5,6)将找不到。@shukiavraham谢谢你的回答,你认为还有其他方法可以替代你发布的方法吗?(矩阵乘法)您可以得到
O(E*max(deg(v))
如果限制边的数量或最大阶数,这会更好。对于每个
边(u,v)
检查
v
的邻接列表并搜索顶点
w
s.t。存在一个
边(w,u)