在图形中查找双顶点


22

G=(V,E)为图。对于的顶点,将定义为中的(开放)邻域。也就是说,。定义两个顶点在是双胞胎如果和具有相同的组的邻居的,即,如果。xVN(x)xGN(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

给定一个在个顶点上有边的图作为输入,如果存在这样的一对孪生,我们可以在多快的时间内找到的一对孪生?GnmG

通过比较两个邻域的邻域,可以检查两个给定的顶点在时间是否为双胞胎。一个简单的算法是找到双胞胎,因此要为每对顶点检查它们是否为双胞胎。这需要时间(并且还会找到所有双胞胎对)。在图中找到(如果存在)一对双胞胎是否有明显更快的方法?文献中是否有解决此问题的已知工作?O(n)O(n3)


您可以遍历邻居并将其添加到哈希表中。相关:cstheory.stackexchange.com/q/3390/236
Radu GRIGore 2011年

1
这是锻炼2.17这里books.google.co.uk/...
拉杜·格里戈里

具有编辑权限的人应该修正双胞胎的定义。(请参阅TheMachineCharmer答案的注释或我链接的书中的定义。)
Radu GRIGore 2011年

Answers:


21

图中的双胞胎只是大小为2的模块。图的模分解可以在时间内找到。模块化分解树隐式表示图的所有模块,并由三种内部节点组成:系列,并行和素数节点,叶子由单个节点组成。一组至少两个顶点的小号V是一个模块,当且仅当它是在树一些节点或一些组串联或并联节点的子节点的的联合。O(n+m)SV

因此,要找到一对孪生节点(如果存在),我们可以在时间内构建模块化分解树。然后查看叶子,如果任何叶子的父级是一个串联或并联节点,则该节点必须至少具有两个孩子,它们构成一对双胞胎。因此,总运行时间是线性的。O(n+m)

http://en.wikipedia.org/wiki/Modular_decomposition


感谢您也向我介绍了模块化分解!
gphilip 2011年

12

问题等同于确定图矩阵中是否存在两个相等的行。我们可以在图矩阵的行上构造特里。时间复杂度将为O(n ^ 2)


6
邻接表上的相同想法给出O(m+n)
Radu GRIGore 2011年

现在,我正在放飞一只苍蝇;)
张显之(张显之

2
这一点可以概括。如果我们改写问题作“给定(其中这里˚F X = Ñ X )找到不同X 1X 2,使得˚F X 1= ˚F X 2 ”,那么为全序ý一个方法是评估˚F X 每个X Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX,对它们进行排序,然后检查排序列表是否重复。特里是有效的基数排序。
彼得·泰勒

8

编辑:@MikleB和@Travis的解决方案非常聪明。抱歉,您的答案太过残酷了。


似乎可以通过用EQU(即NXOR)替换乘法并用AND进行加法运算,将问题简化为图的邻接矩阵上的矩阵乘法问题。所以,如果有图中的一对双胞胎,然后将所得的矩阵Ť不会是单位矩阵,以及指数Ĵ 其中值一个Ĵ不是零是完全双对节点。AAAT(i,j)ai,j

据我所知矩阵乘法问题可以得到解决的时间与α 2.376铜匠,威诺格拉德算法。如果需要实际的解决方案,那么任何矩阵乘法算法在实践中都能很好地工作。O(nα)α2.376


太棒了!:DI认为仅评估上半部分就足够了。你怎么看?A2
Pratik Deoghare,2011年

1
@TheMachineCharmer:谢谢:)是的,如果图形是无向的。
张显之张显之2011年

是。究竟!:)
Pratik Deoghare 2011年

5

由于该站点上的疯狂系统,我无法直接发表评论,但是我对现有答案有一些观察。

我敢肯定,献智昌的解决方案需要正确的一个一个牛逼A2AAT

MachineCharmer的观察结果4是从后到前的(反例:[0,0,1],[0,1,0],[0,1,1]的行列式为0,但没有双胞胎)。如果存在双胞胎,则行列式为零。


我认为没问题。有什么例子吗?顺便说一句,这个网站上的系统并不疯狂!:)A2
Pratik Deoghare 2011年

适用于无向图(对于 A == A T),但通常不适用于有向图。XNOR上的AND需要比较两行A,矩阵乘法对第一个矩阵的一行和第二个矩阵的一列进行运算。A2AAT
彼得·泰勒

系统可能并不疯狂,但可能与第一次发布者背道而驰。您可以回答,但不能发表评论...但是您的评论很好,恕我直言,足以证明发布的合理性。建立起更多声誉后,我认为您会发现该系统上瘾。
hardmath 2011年

3
能够回答但不发表评论疯狂的。它迫使新用户在没有帮助或在错误的地方回答之间进行选择。
彼得·泰勒

3

这个线程已经很老了。但是,似乎没有人想到最优雅,最简单的方法。按顺序按O(n + m)时间排序邻接表,然后检查是否有重复项(请参阅Aho,Hopcroft,Ullman,74')。您可以使用模块化分解,但这是完全多余的。


2

该线程较旧,OP的问题已得到解答,但我想添加另一种算法以在线性时间内查找所有此类对。没有人提到分区优化

该算法找到假双胞胎的等价类。该算法依靠细化分区的有效过程。给定一个集合S和一个分区P = {X1, ..., Xn}refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}^表示集合交集和-集合差。如果无法进一步优化分区,则该分区是稳定的。此过程花费时间O(| S |)(请参阅Wikipedia上有关分区优化的文章),因此速度很快。

Algorithm:

P = {V} // initial partition consists of the vertex set
for every vertex v:
    P = refine(P, N(v)) // refine with the open neighborhood of v

总时间为O(| V | + | E |)。这也很容易编程。


1

一些观察可能会有所帮助

  1. 如果一个不是孪生b然后Çd不能双胞胎其中 Ç Ñ d Ñ b a,bVabcdcN(a)dN(b)

  2. 那么 a b不能是双胞胎。|N(a)||N(b)|ab

  3. bN(a)ab

  4. 如果存在双胞胎,则邻接矩阵的行列式为零。

花哨的主意:

  1. 用height = | V |构建一个完整的二叉树。
  2. 然后开始读取一行邻接矩阵。
  3. 如果遇到0,则左走,否则右走。
  4. 当您到达叶子时,将顶点存储在那里。
  5. 对所有行执行此操作。因此,最后每个叶子都会有邻居。

受霍夫曼压缩算法启发而被盗!:)


2
只有当我们寻找不相邻的双胞胎时,第三点才是正确的。在双胞胎的通常观念中,一种b允许相邻。
Mathieu Chapelle

1
彼得·泰勒(Peter Taylor),马修·夏佩(Mathieu Chapelle):谢谢!我已经编辑了答案以反映更改。@Serge Gaspers:我想在这种情况下,条件一定是ñ一种-b=ñb-一种
Pratik Deoghare,2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.