令为图。对于的顶点,将定义为中的(开放)邻域。也就是说,。定义两个顶点在是双胞胎如果和具有相同的组的邻居的,即,如果。
给定一个在个顶点上有边的图作为输入,如果存在这样的一对孪生,我们可以在多快的时间内找到的一对孪生?
通过比较两个邻域的邻域,可以检查两个给定的顶点在时间是否为双胞胎。一个简单的算法是找到双胞胎,因此要为每对顶点检查它们是否为双胞胎。这需要时间(并且还会找到所有双胞胎对)。在图中找到(如果存在)一对双胞胎是否有明显更快的方法?文献中是否有解决此问题的已知工作?
令为图。对于的顶点,将定义为中的(开放)邻域。也就是说,。定义两个顶点在是双胞胎如果和具有相同的组的邻居的,即,如果。
给定一个在个顶点上有边的图作为输入,如果存在这样的一对孪生,我们可以在多快的时间内找到的一对孪生?
通过比较两个邻域的邻域,可以检查两个给定的顶点在时间是否为双胞胎。一个简单的算法是找到双胞胎,因此要为每对顶点检查它们是否为双胞胎。这需要时间(并且还会找到所有双胞胎对)。在图中找到(如果存在)一对双胞胎是否有明显更快的方法?文献中是否有解决此问题的已知工作?
Answers:
图中的双胞胎只是大小为2的模块。图的模分解可以在时间内找到。模块化分解树隐式表示图的所有模块,并由三种内部节点组成:系列,并行和素数节点,叶子由单个节点组成。一组至少两个顶点的小号⊂ V是一个模块,当且仅当它是在树一些节点或一些组串联或并联节点的子节点的的联合。
因此,要找到一对孪生节点(如果存在),我们可以在时间内构建模块化分解树。然后查看叶子,如果任何叶子的父级是一个串联或并联节点,则该节点必须至少具有两个孩子,它们构成一对双胞胎。因此,总运行时间是线性的。
问题等同于确定图矩阵中是否存在两个相等的行。我们可以在图矩阵的行上构造特里。时间复杂度将为O(n ^ 2)
编辑:@MikleB和@Travis的解决方案非常聪明。抱歉,您的答案太过残酷了。
似乎可以通过用EQU(即NXOR)替换乘法并用AND进行加法运算,将问题简化为图的邻接矩阵上的矩阵乘法问题。所以,如果有图中的一对双胞胎,然后将所得的矩阵甲甲Ť不会是单位矩阵,以及指数(我,Ĵ )其中值一个我,Ĵ不是零是完全双对节点。
据我所知矩阵乘法问题可以得到解决的时间与α ≈ 2.376由铜匠,威诺格拉德算法。如果需要实际的解决方案,那么任何矩阵乘法算法在实践中都能很好地工作。
由于该站点上的疯狂系统,我无法直接发表评论,但是我对现有答案有一些观察。
我敢肯定,献智昌的解决方案需要正确的到一个一个牛逼。
MachineCharmer的观察结果4是从后到前的(反例:[0,0,1],[0,1,0],[0,1,1]的行列式为0,但没有双胞胎)。如果存在双胞胎,则行列式为零。
这个线程已经很老了。但是,似乎没有人想到最优雅,最简单的方法。按顺序按O(n + m)时间排序邻接表,然后检查是否有重复项(请参阅Aho,Hopcroft,Ullman,74')。您可以使用模块化分解,但这是完全多余的。
该线程较旧,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 |)。这也很容易编程。
一些观察可能会有所帮助
为如果一个不是孪生b然后Ç和d不能双胞胎其中 Ç ∈ Ñ (一)和d ∈ Ñ (b )。
那么 a和 b不能是双胞胎。
如果存在双胞胎,则邻接矩阵的行列式为零。
花哨的主意:
受霍夫曼压缩算法启发而被盗!:)