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)=∑n∈N(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.