Encontrar vértices gemelos en gráficos


22

Deje ser un gráfico. Para un vértice x V , definir N ( x ) para ser el barrio (abierto) de x en G . Es decir, N ( x ) = { y VG=(V,E)xVN(x)xG . Defina dos vértices u , v en G para que seangemelossi u y v tienen el mismo conjunto de vecinos, es decir, si N ( u ) = N ( v ) .N(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

Dado un gráfico en n vértices ym aristas como entrada, ¿qué tan rápido podemos encontrar un par de gemelos en G , si tal par existe?GnmG

Podemos verificar si dos vértices dados son gemelos en el tiempo , comparando sus vecindarios. Un algoritmo directo es encontrar gemelos para verificar, para cada par de vértices, si son gemelos. Esto toma tiempo O ( n 3 ) (y también encuentra todos los pares de gemelos). ¿Hay una manera significativamente más rápida de encontrar (si existe) un par de gemelos en el gráfico? ¿Existe algún trabajo conocido en la literatura que aborde este problema?O(n)O(n3)


Podrías recorrer los vecindarios y agregarlos a una tabla hash. Relacionado: cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
Este es el ejercicio 2.17 aquí books.google.co.uk/…
Radu GRIGore

Alguien con poderes de edición debería corregir la definición de gemelos. (Vea los comentarios sobre la respuesta de TheMachineCharmer, o la definición en el libro que
vinculé

Respuestas:


21

Los gemelos en un gráfico son solo módulos de tamaño 2. La descomposición modular de un gráfico se puede encontrar en el tiempo . El árbol de descomposición modular representa implícitamente todos los módulos del gráfico y consta de tres tipos de nodos internos: nodos serie, paralelo y primo, y las hojas consisten en nodos individuales. Un conjunto de al menos dos vértices S V es un módulo si y solo si es un nodo en el árbol o la unión de algún conjunto de hijos de una serie o un nodo paralelo.O(n+m)SV

Entonces, para encontrar un par de nodos gemelos, si existen, podemos construir el árbol de descomposición modular en tiempo . Luego mire las hojas, si el padre de cualquier hoja es un nodo en serie o paralelo, entonces ese nodo debe tener al menos dos hijos que formen un par gemelo. Entonces, el tiempo total de ejecución es lineal.O(n+m)

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


¡Gracias también por presentarme a la descomposición modular!
gphilip

12

El problema es equivalente a determinar si hay dos filas iguales en la matriz gráfica. Podemos construir trie en filas de matriz gráfica. La complejidad del tiempo será O (n ^ 2)


66
La misma idea en las listas de adyacencia da . O(m+n)
Radu GRIGore

Ahora estoy atacando una mosca;)
Hsien-Chih Chang 張顯 之

2
Esto se puede generalizar un poco. Si reformulamos el problema como "Dado (donde aquí f ( x ) : = N ( x ) ) encontramos x 1 , x 2 distintos de modo que f ( x 1 ) = f ( x 2 ) " entonces para Y totalmente ordenado, un enfoque es evaluar f ( x ) para cada x Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX, ordénelos y verifique la lista ordenada en busca de duplicados. El trie es efectivamente una clasificación de radix.
Peter Taylor

8

EDITAR: las soluciones de @MikleB y @Travis son mucho más inteligentes. Perdón por la respuesta exagerada.


Parece que el problema puede reducirse al problema de multiplicación de la matriz en la matriz de adyacencia del gráfico, reemplazando la multiplicación con EQU (es decir, NXOR) y la suma con AND. Entonces, si hay un par de gemelos en el gráfico, entonces la matriz resultante A A T no será la matriz de identidad, y los índices ( i , j ) donde el valor a i , j no es cero son exactamente los nodos del par gemelo .AAAT(i,j)ai,j

Que yo sepa, el problema de multiplicación de matrices se puede resolver en tiempo con α 2.376 mediante el algoritmo Coppersmith-Winograd . Si se necesitan soluciones prácticas, cualquier algoritmo de multiplicación de matrices que funcione bien en la práctica es bueno.O(nα)α2.376


A2

1
@TheMachineCharmer: Gracias :) Sí, si el gráfico no está dirigido.
Hsien-Chih Chang 張顯 之

Sí. ¡Exactamente! :)
Pratik Deoghare

5

Debido al sistema loco en este sitio, no puedo comentar directamente, pero tengo un par de observaciones sobre las respuestas existentes.

A2AAT

La observación 4 de TheMachineCharmer está de vuelta al frente (contraejemplo: [0,0,1], [0,1,0], [0,1,1] tiene determinante 0 pero no gemelos). Si existen gemelos, entonces el determinante es cero.


A2

A2AAT

El sistema puede no ser una locura, pero tal vez sea contradictorio con los carteles por primera vez. Puede responder pero no comentar ... pero sus comentarios fueron lo suficientemente buenos en mi humilde opinión para justificar la publicación. Una vez que haya acumulado más reputación, creo que encontrará el sistema bastante adictivo.
hardmath

3
Ser capaz de responder pero no comentar es una locura. Obliga a los nuevos usuarios a elegir entre no ser útiles o responder en el lugar equivocado.
Peter Taylor

3

Este hilo es bastante viejo; Sin embargo, nadie parece haber dado con el enfoque más elegante y simple. Clasifique lexicográficamente la lista de adyacencia en tiempo O (n + m) y luego busque duplicados (ver Aho, Hopcroft, Ullman, 74 '). Puede usar la descomposición modular, pero esto es una exageración total.


2

Este hilo es antiguo y la pregunta de OP ha sido respondida, pero me gustaría agregar otro algoritmo para encontrar todos estos pares en tiempo lineal. ¡Nadie mencionó el refinamiento de partición !

Este algoritmo encuentra las clases de equivalencia de gemelos falsos. El algoritmo se basa en un procedimiento eficiente que refina una partición. Dado un conjunto Sy una partición P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^denota la intersección -establecida y la diferencia establecida. Una partición es estable si no se puede refinar más. Este procedimiento lleva tiempo O (| S |) (consulte el artículo de Wikipedia sobre el refinamiento de la partición), por lo que es rápido.

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

El tiempo total es O (| V | + | E |). Esto es simple de programar también.


1

Algunas observaciones que pueden ayudar

  1. a,bVabcdcN(a)dN(b)

  2. |N(a)||N(b)|ab

  3. bN(a)ab

  4. Si existen gemelos, entonces el determinante de la matriz de adyacencia es cero.

Idea de lujo:

  1. Construya un árbol binario completo con altura = | V |.
  2. Luego comience a leer una fila de matriz de adyacencia.
  3. Si encuentra 0, gire a la izquierda, de lo contrario, gire a la derecha.
  4. Cuando llegues a una hoja, almacena tu vértice allí.
  5. Haga esto para todas las filas. Entonces, al final cada hoja tendrá vecinos.

¡Robado del algoritmo de compresión Inspirado por Huffman! :)


2
ab

1
N(a)b=N(b)a
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.