Recherche de sommets jumeaux dans les graphiques


22

Soit un graphe. Pour un sommet , définir pour être le (ouvert) voisinage de dans . Autrement dit, . Définissez deux sommets dans comme des jumeaux si et ont le même ensemble de voisins, c'est-à-dire si .g=(V,E)XVN(X)XgN(X)={yV|{X,y}E}u,vguvN(u)=N(v)

Étant donné un graphique sur sommets et arêtes en entrée, à quelle vitesse peut-on trouver une paire de jumeaux dans , si une telle paire existe?gnmg

Nous pouvons vérifier si deux sommets donnés sont des jumeaux en temps , en comparant leurs voisinages. Un algorithme simple est de trouver des jumeaux, c'est donc de vérifier, pour chaque paire de sommets, s'il s'agit de jumeaux. Cela prend du temps (et trouve également toutes les paires de jumeaux). Existe-t-il un moyen beaucoup plus rapide de trouver (s'il existe) une paire de jumeaux dans le graphique? Existe-t-il des travaux connus dans la littérature qui traitent de ce problème?O(n)O(n3)


Vous pouvez parcourir les quartiers et les ajouter à une table de hachage. Connexe: cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
C'est l'exercice 2.17 ici books.google.co.uk/…
Radu GRIGore

Quelqu'un avec des pouvoirs d'édition devrait fixer la définition des jumeaux. (Voir les commentaires sur la réponse de TheMachineCharmer, ou la définition dans le livre que j'ai lié.)
Radu GRIGore

Réponses:


21

Les jumeaux dans un graphique ne sont que des modules de taille 2. La décomposition modulaire d'un graphique peut être trouvée en temps . L'arbre de décomposition modulaire représente implicitement tous les modules du graphique et se compose de trois types de nœuds internes: les nœuds série, parallèle et premier, et les feuilles se composent des nœuds individuels. Un ensemble d'au moins deux sommets est un module si et seulement s'il s'agit d'un nœud de l'arbre ou de l'union d'un ensemble d'enfants d'une série ou d'un nœud parallèle.S VO(n+m)SV

Donc, pour trouver une paire de nœuds jumeaux, s'ils existent, nous pouvons construire l'arbre de décomposition modulaire en temps . Regardez ensuite les feuilles, si le parent d'une feuille est un nœud série ou parallèle, alors ce nœud doit avoir au moins deux enfants qui forment une paire jumelle. La durée totale de fonctionnement est donc linéaire.O(n+m)

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


Merci également de m'avoir initié à la décomposition modulaire!
gphilip

12

Le problème revient à déterminer s'il y a deux lignes égales dans la matrice graphique. Nous pouvons construire un trie sur des lignes de matrice graphique. La complétion temporelle sera O (n ^ 2)


6
La même idée sur les listes d'adjacence donne . O(m+n)
Radu GRIGore

Maintenant, je fouine une mouche;)
Hsien-Chih Chang 張顯 之

2
Cela peut être quelque peu généralisé. Si nous reformulons le problème comme "Étant donné (où ici f ( x ) : = N ( x ) ) trouver distinct x 1 , x 2 tels que f ( x 1 ) = f ( x 2 ) " alors pour Y totalement ordonné, une approche consiste à évaluer f ( x ) pour chaque x Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX, triez-les et recherchez les doublons dans la liste triée. Le trie est en fait un tri radix.
Peter Taylor

8

EDIT: les solutions de @MikleB et @Travis sont très intelligentes. Désolé pour la réponse exagérée.


Il semble que le problème puisse être réduit au problème de multiplication matricielle sur la matrice d'adjacence du graphe, en remplaçant la multiplication par EQU (c'est-à-dire NXOR) et l'addition par AND. Donc, s'il y a une paire de jumeaux dans le graphique, alors la matrice résultante A A T ne sera pas la matrice d'identité, et les indices ( i , j ) où la valeur a i , j n'est pas nulle sont exactement les nœuds de paire jumelle .UNEUNEUNET(je,j)uneje,j

À ma connaissance, le problème de multiplication matricielle peut être résolu en temps avec α 2,376 par l' algorithme de Coppersmith – Winograd . Si des solutions pratiques sont nécessaires, tous les algorithmes de multiplication matricielle fonctionnent bien dans la pratique sont agréables.O(nα)α2,376


Génial, cela fonctionne! : DI pense qu'il suffira d'évaluer uniquement la moitié supérieure de l' . Qu'est-ce que tu penses? UNE2
Pratik Deoghare

1
@TheMachineCharmer: Merci :) Oui, si le graphique n'est pas orienté.
Hsien-Chih Chang 張顯 之

Oui. Exactement! :)
Pratik Deoghare

5

En raison du système fou sur ce site, je ne peux pas commenter directement, mais j'ai quelques observations sur les réponses existantes.

Je suis sûr que les besoins de solutions de Chang Hsien-Chih pour corriger à A A T .UNE2UNEUNET

L'observation 4 de TheMachineCharmer est dos à face (contre-exemple: [0,0,1], [0,1,0], [0,1,1] a un déterminant 0 mais pas de jumeaux). S'il existe des jumeaux, le déterminant est zéro.


Je ne vois aucun problème avec . Des exemples? btw, le système sur ce site n'est PAS fou! :)A2
Pratik Deoghare

fonctionnerait pour les graphes non orientés (pour lesquels A == A T ) mais pas, en général, pour les graphes dirigés. L'AND sur XNOR doit comparer deux lignes de A, et la multiplication matricielle opère sur une ligne de la première matrice avec une colonne de la seconde. UNE2UNEUNET
Peter Taylor

Le système n'est peut-être pas fou, mais peut-être contre-intuitif pour les premières affiches. Vous pouvez répondre mais pas commenter ... mais vos commentaires étaient assez agréables à mon humble avis pour justifier la publication. Une fois que vous avez construit plus de réputation, je pense que vous trouverez le système assez addictif.
hardmath

3
Pouvoir répondre mais pas commenter est fou. Cela oblige les nouveaux utilisateurs à choisir entre ne pas être utile ou répondre au mauvais endroit.
Peter Taylor

3

Ce fil est assez ancien; cependant, personne ne semble avoir adopté l'approche la plus élégante et la plus simple. Trier lexicographiquement la liste d'adjacence en temps O (n + m) puis vérifier les doublons (voir Aho, Hopcroft, Ullman, 74 '). Vous pouvez utiliser la décomposition modulaire, mais c'est une exagération totale.


2

Ce fil est ancien et la question d'OP a été répondue, mais j'aimerais ajouter un autre algorithme pour trouver toutes ces paires en temps linéaire. Personne n'a mentionné le raffinement de partition !

Cet algorithme trouve les classes d'équivalence de faux jumeaux. L'algorithme repose sur une procédure efficace qui affine une partition. Étant donné un ensemble Set une partition P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^désigne l'intersection -définie et la différence définie. Une partition est stable si elle ne peut pas être affinée davantage. Cette procédure prend du temps O (| S |) (voir l'article de Wikipedia sur le raffinement des partitions), donc c'est rapide.

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

Le temps total est O (| V | + | E |). C'est aussi simple à programmer.


1

Quelques observations qui pourraient aider

  1. une,bVunebccN(une)N(b)

  2. |N(une)||N(b)|uneb

  3. bN(une)uneb

  4. S'il existe des jumeaux, le déterminant de la matrice d'adjacence est nul.

Idée de fantaisie:

  1. Construisez un arbre binaire complet avec height = | V |.
  2. Commencez ensuite à lire une ligne de la matrice d'adjacence.
  3. Si vous rencontrez 0, prenez à gauche sinon prenez à droite.
  4. Lorsque vous atteignez une feuille, stockez-y votre sommet.
  5. Faites cela pour toutes les lignes. Donc, à la fin, chaque feuille aura des voisins.

Volé à partir de l'algorithme de compression inspiré par Huffman! :)


2
uneb

1
N(une)-b=N(b)-une
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.