Tout d'abord, je suis un débutant en Java, donc je ne sais pas si c'est encore possible! Fondamentalement, j'ai une énorme source de données relationnelles (3 + million) (c.-à-d. A est ami avec B + C + D, B est ami avec D + G + Z (mais pas A - c'est-à-dire non mutuel etc.) et je veux pour trouver chaque cycle dans ce graphe orienté (pas nécessairement connecté).trouver TOUS les cycles dans une énorme matrice clairsemée
J'ai trouvé le fil Finding all cycles in graph, qui m'a pointé vers l'algorithme de recherche de cycle (élémentaire) de Donald Johnson qui, superficiellement au moins, a l'air de faire ce que je veux (je vais essayer quand je suis de retour au travail mardi - je pensais que ça ne me ferait pas de mal de demander en attendant!).
J'ai eu une analyse rapide à travers le code de l'implémentation Java de l'algorithme de Johnson (dans ce fil) et il ressemble à une matrice de relations est la première étape, donc je suppose que mes questions sont les suivantes:
a) Java est-il capable de gérer une matrice de 3 + millions * 3 + millions? (prévoyait de représenter A-friends-with-B par une matrice binaire clairsemée)
b) Ai-je besoin de trouver tous les sous-graphes connectés comme premier problème, ou les algorithmes de recherche de cycles gérera-t-il des données disjointes? C) Est-ce une solution appropriée au problème? Ma compréhension des cycles «élémentaires» est que dans le graphique ci-dessous, plutôt que de choisir A-B-C-D-E-F, il faudra choisir A-B-F, B-C-D etc. mais ce n'est pas la fin du monde.
E
/\
D---F
/\/\
C---B---A
d) Si nécessaire, je peux simplifier le problème en appliquant dans les relations de réciprocité - A-dire avec des amis-B < ==> B amis avec-A, et si je peux peut-être vraiment nécessaire réduire la taille des données, mais de façon réaliste, il va toujours être autour de la marque 1mil. Z) S'agit-il d'une tâche P ou NP ?! Est-ce que je mords plus que je ne peux mâcher?
Merci à tous, toute aide appréciée! Andy
Si vous voulez trouver _every_ cycle, alors ce n'est certainement pas P, car pour un graphe complet vous avez plus de n! cycles. D'un autre côté, si vous voulez juste compter les cycles (sans les sortir), alors c'est P (et donc NP-P est un sous-ensemble de NP). –
Alors voulez-vous trouver chaque sous-ensemble de sommets où tout le monde dans le sous-ensemble est ami avec tout le monde dans ce sous-ensemble? Parce que ce problème s'appelle Maximal Clique: http://en.wikipedia.org/wiki/Maximal_clique#Definitions –
@Tomer: êtes-vous sûr que le problème du comptage des cercles élémentaires dans les graphes non orientés est dans P? – jpalecek