Seja um gráfico. Para um vértice x ∈ V , definir N ( x ) para ser o (aberto) vizinhança de x em L . Ou seja, N ( x ) = { y ∈ V . Defina dois vértices u , v em G comogêmeosse u e v tiverem o mesmo conjunto de vizinhos, ou seja, se N ( u ) = N ( v ) .
Dado um gráfico em n vértices e m arestas como entrada, com que rapidez podemos encontrar um par de gêmeos em G , se esse par existir?
Podemos verificar se dois vértices dados são gêmeos em tempo, comparando suas vizinhanças. Um algoritmo simples é encontrar gêmeos, portanto, é verificar, para cada par de vértices, se são gêmeos. Isso leva tempo O ( n 3 ) (e também encontra todos os pares de gêmeos). Existe uma maneira significativamente mais rápida de encontrar (se houver) um par de gêmeos no gráfico? Existe trabalho conhecido na literatura que resolva esse problema?
Respostas:
Gêmeos em um gráfico são apenas módulos de tamanho 2. A decomposição modular de um gráfico pode ser encontrada em . A árvore de decomposição modular representa implicitamente todos os módulos do gráfico e consiste em três tipos de nós internos: série, nós paralelos e primos, e as folhas consistem em nós individuais. Um conjunto de pelo menos dois vértices S ⊂ V é um módulo se, e somente se, for algum nó na árvore ou a união de algum conjunto de filhos de uma série ou nó paralelo.O(n+m) S⊂V
Então, para encontrar um par de nós gêmeos, se eles existirem, podemos construir a árvore de decomposição modular em . Então observe as folhas, se o pai de qualquer folha for um nó em série ou paralelo, esse nó deverá ter pelo menos dois filhos que formam um par gêmeo. Portanto, o tempo total de execução é linear.O(n+m)
http://en.wikipedia.org/wiki/Modular_decomposition
fonte
O problema é equivalente a determinar se existem duas linhas iguais na matriz gráfica. Podemos construir três linhas de matriz gráfica. O tempo compleixty será O (n ^ 2)
fonte
EDIT: as soluções @MikleB e @Travis são muito inteligentes. Desculpe pela resposta exagerada.
Parece que o problema pode ser reduzido ao problema de multiplicação de matrizes na matriz de adjacência do gráfico, substituindo a multiplicação por EQU (ou seja, NXOR) e a adição por AND. Por isso, se existe um par de gémeos no gráfico, em seguida, a matriz resultante Uma Um T não será a matriz de identidade, e os índices ( i , j ) , onde o valor de i , j não zero é são exactamente os nós duplo par .A AAT (i,j) ai,j
Que eu saiba, o problema da multiplicação de matrizes pode ser resolvido em tempo com α ≈ 2.376 pelo algoritmo Coppersmith – Winograd . Se forem necessárias soluções práticas, qualquer algoritmo de multiplicação de matrizes que funcione bem na prática é bom.O(nα) α≈2.376
fonte
Por causa do sistema maluco deste site, não posso comentar diretamente, mas tenho algumas observações sobre as respostas existentes.
Tenho certeza de que as necessidades de soluções de Hsien-Chih Chang para corrigir a A A T .A2 AAT
A observação 4 de TheMachineCharmer está de volta à frente (contra-exemplo: [0,0,1], [0,1,0], [0,1,1] tem determinante 0, mas não gêmeos). Se existirem gêmeos, o determinante é zero.
fonte
Este tópico é bastante antigo; no entanto, ninguém parece ter adotado a abordagem mais elegante e simples. Classifique Lexicograficamente a lista de adjacências em O (n + m) e verifique se há duplicatas (consulte Aho, Hopcroft, Ullman, 74 '). Você pode usar a decomposição modular, mas isso é um exagero total.
fonte
Esse tópico é antigo e a pergunta do OP foi respondida, mas eu gostaria de adicionar outro algoritmo para encontrar todos esses pares em tempo linear. Ninguém mencionou o refinamento de partição !
Este algoritmo encontra as classes de equivalência de gêmeos falsos. O algoritmo baseia-se em um procedimento eficiente que refina uma partição. Dado um conjunto
S
e uma partiçãoP = {X1, ..., Xn}
.refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}
.^
indica interseção-
definida e diferença definida. Uma partição é estável se não puder mais ser refinada. Esse procedimento leva tempo O (| S |) (consulte o artigo da Wikipedia sobre refinamento de partição), por isso é rápido.O tempo total é O (| V | + | E |). É simples de programar também.
fonte
Algumas observações que podem ajudar
Se existirem gêmeos, o determinante da matriz de adjacência é zero.
Ideia extravagante:
Roubado doalgoritmo de compressão Inspired by Huffman! :)fonte