Nombre de sommets accessibles en DAG pour chaque sommet


11

Soit un graphe dirigé acyclique, tel que le degré extérieur de tout sommet soit . Pour chaque sommet de nous pouvons compter le nombre de sommets accessibles, simplement en exécutant dfs à partir de chaque sommet et cela prendra du temps . Existe-t-il une meilleure façon de résoudre ce problème?O ( log | V | ) GG(V,E)O(log|V|)GO(|V||E|)



1
@Radu est-ce un double direct? ça sonne comme ça
Suresh Venkat

@Suresh, par rapport à ma question, celui-ci a une limite supérieure sur le degré du sommet et ne demande pas de limites inférieures. Ce sont de petites différences à mon avis, donc je le considérerais comme un doublon, mais je n'y pense pas beaucoup.
Radu GRIGore

1
ok donc nous allons le laisser tel quel.
Suresh Venkat

4
La réponse de virgi à ma question implique un algorithme pour celui-ci. O(|V|2)
Radu GRIGore

Réponses:


5

Le meilleur algorithme exact s'exécutera dans le temps O (min {mn, n ^ 2,38}) en utilisant une multiplication matricielle binaire rapide. Cependant, il existe un algorithme aléatoire, qui s'exécute dans le temps O (m + n) et estime le nombre de nœuds accessibles à partir de chaque nœud avec une petite erreur relative, veuillez vous reporter à l'article " Cadre d'estimation de la taille avec des applications à la fermeture et à l'accessibilité transitives" "par Edith Cohen.


-1

Je ne suis pas un expert ici je vais essayer.

1) Puisqu'il s'agit de DAG, il devrait avoir un sommet de puits, c'est-à-dire un sommet avec un degré 0. Trouver un sommet de puits dire x et ajouter {x} comme sommet accessible au voisin (x). supprimer x et répéter le processus jusqu'à ce que le graphique devienne vide


Étant donné que le degré extérieur est limité, il semblerait plus utile de commencer par une source?
András Salamon

@ andras-salamon: non, car vous ne savez pas combien de nœuds sont accessibles depuis une source. Mais vous ne faites pas ça (zéro) pour un évier.
Martin

Le temps d'exécution de cet algorithme est également - donc pas mieux que ce qui a été décrit dans la question. À chaque étape, le sommet que vous envisagez peut avoir un ensemble de sommets accessibles; vous ajoutez cela à chacun de ses voisins, ce qui prend temps par voisin. Au total, vous effectuez travail par arête, pour un total de travail. O(|V||E|)xO(|V|)O(|V|)O(|V|)O(|V||E|)
DW

-2

(Similaire à la solution de Prabu ... mais plus détaillée)

Soit les voisins (sortants) de et dénote le nombre de sommets accessibles depuis v.N(v)vreach(v)

  1. faire un tri topologique. (possible en )O(|V|+|E|)
  2. à partir de la fin de la liste (à l'extrémité d'un puits): Pour chaque sommet (à partir de l'extrémité de la liste): .r e a c h ( v ) = n N ( v ) r e a c h ( n )vreach(v)=nN(v)reach(n)

La deuxième partie traverse chaque arête une fois, en ajoutant une autre, donc au total je reçois .O ( | V | + ||E|O(|V|+|E|)

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.