Le problème, bien sûr, est le double comptage. Il est assez facile à faire pour certaines classes de DAG = un arbre, voire un arbre parallèle-série. Le seul algorithme que j'ai trouvé qui fonctionne sur les DAG généraux en un temps raisonnable est approximatif (Synopsis diffusion), mais augmenter sa précision est exponentiel en nombre de bits (et j'ai besoin de beaucoup de bits).
Contexte: cette tâche est effectuée (plusieurs fois avec des «poids» différents) dans le cadre des calculs de probabilité dans BBChop (http://github.com/ealdwulf/bbchop), un programme permettant de rechercher des bogues intermittents (c'est-à-dire une version bayésienne de ' git bisect '). Le DAG en question est donc un historique de révision. Cela signifie qu'il est peu probable que le nombre d'arêtes se rapproche du carré du nombre de nœuds, il sera probablement inférieur à k fois le nombre de nœuds pour certains k plus petits. Malheureusement, je n'ai trouvé aucune autre propriété utile des DAG de révision. Par exemple, j'espérais que le composant triconnecté le plus important ne deviendrait la racine carrée du nombre de nœuds, mais malheureusement (du moins dans l'histoire du noyau Linux), il croît de manière linéaire.
Réponses:
Nous supposons que les poids de sommet peuvent être des entiers positifs arbitraires ou, plus précisément, ils peuvent être des entiers positifs au plus 2 n . Ensuite, la tâche en cours ne peut pas être exécutée même dans un intervalle de temps légèrement plus faible, O ( n 2 ), à moins que la fermeture transitive d'un graphe dirigé arbitraire ne puisse être calculée en temps O ( n 2 ), où n indique le nombre de sommets. (Notez qu'un algorithme de temps O ( n 2 ) pour la fermeture transitive sera une percée.) Ceci est la contrapositive de la revendication suivante:
Revendication . Si la tâche en cours peut être exécutée dans le temps O ( n 2 ), la fermeture transitive d'un graphe dirigé arbitraire donné sous forme de matrice d'adjacence peut être calculée en O ( n 2 ) temps (en supposant un modèle de calcul raisonnable).
Preuve . En prétraitement, nous calculons la décomposition en composantes fortement connectées du graphe orienté donné G en temps O ( n 2 ) pour obtenir un DAG G '. Notez que si l' on peut calculer la fermeture transitive de G ', nous pouvons reconstruire la fermeture transitive de G .
Attribuez maintenant le poids 2 i à chaque sommet i du DAG G 'et utilisez l'algorithme pour le problème actuel. Ensuite, la représentation binaire de la somme affectée à chaque sommet i décrit exactement l'ensemble des ancêtres de i ; en d'autres termes, nous avons calculé la fermeture transitive de G '. QED .
L'inverse de la revendication est également vrai: si vous pouvez calculer la fermeture transitive d'un DAG donné, il est facile de calculer les sommes requises par le travail supplémentaire dans le temps O ( n 2 ). Par conséquent, en théorie, vous pouvez réaliser la tâche en cours dans le temps O ( n 2.376 ) en utilisant l'algorithme de fermeture transitive basé sur l' algorithme de multiplication matricielle Coppersmith-Winograd .
Edit : La révision 2 et les versions antérieures n'énonçaient pas explicitement l'hypothèse concernant la plage de poids des sommets. Per Vognsen a souligné dans un commentaire que cette hypothèse implicite pourrait ne pas être raisonnable (merci!), Et je suis d'accord. Même si des poids arbitraires ne sont pas nécessaires dans les applications, je suppose que cette réponse pourrait exclure certaines approches du raisonnement suivant: la fermeture peut être calculée en temps O ( n 2 ). ”
Edit : La révision 4 et antérieure indiquait de manière incorrecte la direction des bords.
la source
Ceci est une extension de mon commentaire sur la réponse de Tsuyoshi. Je pense que la réponse négative à la question peut être rendue inconditionnelle.
Le point semble être que l’ordre partiel sous-jacent est dense, mais le DAG représente sa réduction transitive, qui peut être rare.
la source
Ceci est faux et est basé sur un malentendu sur la question. Merci à Tsuyoshi pour avoir patiemment signalé mon erreur. Laissant au cas où d'autres font la même erreur.
Cette approche devrait également bien fonctionner s'il existe des nœuds avec de nombreux prédécesseurs immédiats, pour autant qu'ils soient relativement peu fréquents.
la source