Algorithme pour le diamètre du graphe?
Si vous avez un graphique, et ont besoin de trouver le diamètre de celui-ci (qui est la distance maximale entre deux nœuds), comment pouvez-vous le faire dans O(log v * (v + e))
complexité.
Wikipédia dit que vous pouvez faire cela en utilisant de l'algorithme de Dijkstra
avec un binary heap
.
Mais je ne comprends pas comment cela fonctionne. Quelqu'un peut m'expliquer s'il vous plaît?
Ou de montrer une pseudo-code?
L'algorithme de Dijkstra ne trouverez pas le diamètre du graphe; il faudra juste trouver la distance de certains nœud à chaque autre nœud dans le graphe. Est-il une ressource que vous avez dit que vous pouvez utiliser Dijkstra pour ce faire?
cs.stackexchange.com/questions/194/...
Rien dans le lien indique que vous devez utiliser Dijkstra pour ce faire.
ah ok, mais est-il un moyen de le faire dans
Est sont les arêtes pondérées?
cs.stackexchange.com/questions/194/...
Rien dans le lien indique que vous devez utiliser Dijkstra pour ce faire.
ah ok, mais est-il un moyen de le faire dans
O(log n * (n + e)
de la complexité?Est sont les arêtes pondérées?
OriginalL'auteur omega | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
Pour un Graphique général
G=(V,E)
il n'y a pas deO(log V * (V + E))
complexité temporelle de l'algorithme connu pour le calcul du diamètre.La meilleure solution actuelle est
O(V*V*V)
, par exemple, par le calcul de tous les plus courts Chemins avec Floyd Warshall de l'Algorithme.Pour éparses Graphiques, c'est à dire quand
E
est danso(N*N)
, Johnson Algorithme donne vous avecO(V*V*log(V)+V*E)
un meilleur temps de la complexité.Si votre graphique a certaines propriétés comme acyclique (Arbre) vous pouvez obtenir mieux.
De sorte que la mauvaise nouvelle, c'est que la Dijkstra ne sera pas suffisant dans le cas général...
OriginalL'auteur eci
Je sais que je suis un retard d'un an sur le fil, mais je ne crois pas qu'aucun de ces réponses sont correctes. OP mentionné dans les commentaires que les bords ne sont pas pondérées; dans ce cas, le meilleur algorithme s'exécute en $O(n^{\omega}) \log n$ l'heure (où $\omega$ est l'exposant de la multiplication de matrice; actuellement des limites supérieures à $2.373$ par Virginia Williams).
L'algorithme exploite la propriété suivante des graphes non pondérés. Laissez $A$ être la matrice d'adjacence du graphe avec un ajout d'un auto-boucle pour chaque nœud. Alors $(A^k)_{ij}$ est non nul ssi $d(i, j) \le k$. Nous pouvons utiliser ce fait pour trouver le graphique de diamètre par le calcul de $\log n$ valeurs de $A^k$.
Voici comment fonctionne l'algorithme: laissez $A$ être la matrice d'adjacence du graphe avec un ajout d'un auto boucle pour chaque nœud. Set $M_0 = A$. Alors que $M_k$ contient au moins un zéro, calculer $M_{k+1} = M_{k}^2$.
Par la suite, vous trouverez une matrice de $M_{K}$ avec toutes les entrées non nulles. Nous savons que $K \le \log n$ par la propriété indiqué ci-dessus; par conséquent, nous avons effectué une multiplication de matrice de seulement $O(\log n)$ fois jusqu'à présent. Nous pouvons maintenant continuer en binaire de recherche entre $M_{K} = A^{2^K}$ et $M_{K-1} = A^{2^{K-1}}$. Ensemble $B = M_{K-1}$ comme suit.
Set DIAMÈTRE = $2^{k-1}$. Pour $i = (K-2 \dots 0)$, effectuez le test suivant:
Multiplier $B$ de $M_{i}$ et contrôler la matrice de zéros. Si nous trouvons des zéros, puis définissez $B$ à cette matrice de produit, et d'ajouter $2^i$ de DIAMÈTRE. Sinon, ne rien faire.
Enfin, le retour de DIAMÈTRE.
Comme un mineur de détail d'implémentation, il pourrait être nécessaire de fixer toutes les entrées non nulles de la matrice de $1$ après chaque matrice de la multiplication est effectuée, de sorte que les valeurs ne soit pas trop grand et trop lourd à écrire dans un petit laps de temps.
OriginalL'auteur GMB
Boost BGL a une petite étendue deque classe nommée "rcm_queue" dont l'excentricité d'un sommet peut être trouvé par un simple largeur de recherche, ce qui signifie une complexité de O(E).
http://www.boost.org/doc/libs/1_54_0/boost/graph/detail/sparse_ordering.hpp
Que le diamètre peut être calculé en allant sur l'excentricité de tous les sommets, on peut calculer le diamètre d'un graphe avec une complexité de O(V*E).
Surtout pour une très clairsemée graphique avec deg(G) <<< V, je n'ai pas trouver quoi que ce soit avec une meilleure exécution.
Je n'ai pas regardé dans le Floyd Warshall algorithme. Je viens de traiter avec un graphique avec > 5.000.000 les sommets mais avec un plus haut degré d'un sommet quelconque de moins de 15 et de la pensée, ce qui devrait probablement surpasser un algorithme avec V*V*log(V) de la complexité.
MODIFIER
Sûr, cela ne fonctionne qu'avec un graphe non-dirigé et n'est pas négative pondérée (ou même non pondérée seulement? Je ne suis pas sûr atm)
OriginalL'auteur Theo
Comme ice mentionné, l'une des solutions est d'utiliser la Floyd-Warshall algorithme. Si vous avez besoin du code pour cela, une version C++ de il peut être trouvé ici.
OriginalL'auteur nbanic
D'abord, vous aurez besoin de trouver le l'enveloppe convexe de la graphique (trouver ce qui est O(nh), où h est le nombre de nœuds sur la coque). Les points de diamètre va s'allonger sur l'enveloppe convexe, et donc le problème se réduire à trouver le plus de points dans les h des points. Par conséquent, le total de l'ordre de O(nh+h*h).
OriginalL'auteur Aditya
En fait, si le graphe est extrêmement grande, vous aurez besoin d'utiliser l'algorithme de Dijkstra pour trouver la distance la plus courte. Donc ça dépend du nombre de nœuds de l'OP graphique.
OriginalL'auteur hbranum
En supposant que le graphe est non pondéré ensuite, les étapes suivantes peuvent trouver la solution en O(V * ( V + E )) où V est le nombre de sommets et E est le nombre d'arêtes.
Nous allons définir la distance entre 2 sommets u, v étant la longueur du plus court chemin entre u et v. le note par d(u, v)
Définir l'Excentricité d'un sommet v e(v) = max {d(u, v) | u ∈ V(G)} (V(G) est l'ensemble des sommets d'un graphe G)
Définir Diamètre(G) = max{e(v) | v ∈ V(G)}
Maintenant à l'algorithme:
1 - Pour chaque sommet v de V(G) exécuter BFS(v) et de construire une 2 dimensions, tableau des distances à partir de chaque sommet à d'autres.
(le calcul de la distance à partir de chaque sommet pour les autres est facile à faire dans le L'algorithme BFS)
2 - Calcul de e(v) pour chaque sommet de l'2 dimensions tableau créé à l'étape 1
3 - calculer le diamètre(G) par trouver le maximum d'e(v) à partir de l'étape 2
Maintenant d'analyser cet algorithme, il est facile de voir qu'il est dominé par la première étape qui est de O (V * (V + E))
Lire la présente partie au sujet de diamètre dans Wikipedia
Un autre algorithme qui s'exécute en temps linéaire O(V + E)
1 - Exécuter BFS sur n'importe quel sommet v ∈ V(G)
2 - Choisissez le sommet u avec le maximum de distance
3 - Exécuter BFS nouveau sur ce sommet u
4 - le Diamètre est la distance maximale générés formulaire de l'étape 3
OriginalL'auteur K''
Graphique de la description pure et brute, n nœuds, m bords
Pour le diamètre du graphe, nous avons besoin de calculer le chemin le plus court entre toutes les paires de nœuds. Plus courts chemins entre un nœud source vers tous les autres nœuds peuvent être calculés en utilisant l'algorithme BFS pour un non-orienté et non pondérées graphique. Complexité temporelle est O(n + m) pour 1 nœud. Ici, puisque nous avons besoin de faire un BFS pour n nœuds, le temps total de la complexité de trouver le chemin le plus court entre toutes les paires de nœuds devient O(n(n + m)). Puisqu'il y a n(n-1)/2 paires de nœuds, nous avons donc n(n-1)/2 valeurs du chemin le plus court entre tous les nœuds. Pour le diamètre, nous avons besoin de tirer le maximum de ces valeurs, ce qui est nouveau en O(n*n). Donc la dernière fois de la complexité devient:
Pseudo-code pour obtenir les plus courts chemins entre toutes les paires de nœuds. Nous sommes à l'aide d'une matrice nommée Shortest_paths pour stocker les chemins les plus courts entre chaque paire de nœuds. Nous sommes à l'aide d'un dictionnaire nommé drapeau qui a des valeurs vrai ou faux qui indique si le sommet a été visité ou non. Pour chaque itération de la BFS, nous initialisons ce dictionnaire à tout faux. Nous utilisons une File d'attente Q pour effectuer notre BFS.
L'algorithme BFS(pour tous les nœuds)
OriginalL'auteur s.dutta
Cela ne peut se faire avec un graphe non pondéré. Où bfs donne le plus court chemin de l'arbre dans l'o(v+e) et que vous répétez la même chose pour v sources.
OriginalL'auteur mrityunjoy