IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Sauvegarde d'un graphe non-orienté


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut Sauvegarde d'un graphe non-orienté
    Bonsoir.

    J'ai un projet de fin de semestre à réaliser en théorie des graphes, et je me vois être obligé de développer deux méthodes permettant de sauvegarder/charger mon graphe (connexe ou non).

    Par conséquent, et dans cette optique, j'aurais souhaité savoir si certains d'entre vous pouvaient me diriger vers des documentations ou des exemples de tels procédés. Je n'attends pas de code.

    Merci d'avance pour votre aide.

  2. #2
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Salut pour le avant de charger/sauvegarder il va déjà te falloir une structure qui représentera ton graphe et une pour tes noeuds. Recherche du coté des arbres c'est assez proche. Pour la méthode de sauvegarde chargement tu devrais trouver quelque chose de simple pour le sauver/charger en xml.
    Pour la deuxième je ne sais, tu peux en faire une méthode maison qui te sauve ton graphe dans un .txt mais ce sera à toi de faire l'algo de sauvegarde (le chargement etant très similaire).
    Bon courage .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Merci pour ta réponse.

    Ma structure est déjà spécifiée et implantée (graphes, sommets, arêtes).
    Quant à la méthode de sauvegarde/chargement, en effet elle peut-être faite maison, mais je me disais qu'un gars bien plus futé que moi avait certainement déjà trouvé une méthode pour ce genre de problème.

    Recherche du coté des arbres c'est assez proche
    J'ai l'impression que le codage de Prüfer se porterait mal, à moins que cela ne soit possible ? Auquel cas, je m'y mets de suite.
    Bon courage.
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    http://graphml.graphdrawing.org/

    (par contre, ce sera probablement plus complexe que ce dont tu as besoin).


    Sinon, de base, dans xml il existe les notions d'ID/IDRef.

    Donc tu crées des tags nods qui contiennent un attribut/élément id de type xs:ID, des informations et une liste de liens qui contiennent chacun un attribut/élément de type xs:IDREF.


    Par contre, ouaip, c'est sur, XML c'est particulièrement verbeux comme schéma.


    Un peu plus d'infos: http://sta.uwi.edu/staff/mbernard/re...ileformats.pdf
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Si ton graphe est un objet sérialisable, je pense que tu va trouver ça simple :
    http://java.developpez.com/faq/java/..._serialisation

    Cordialement,
    Patrick Kolodziejczyk.

    Edit : La solution XML est sympathique, mais pas forcément nécessaire.
    Re-edit: fallait être plus rapide =)
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Si ton graphe est représenté par un objet, tu peux essayer de le sérialiser ?

    Edit : grillé de 4 secondes.....

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup pour toutes vos réponses.

    XML me semble en effet extrêmement complet, peut-être trop au vu du projet.
    Enfin, la sérialisation me parait très simple mais (peut-être à tort) trop peu optimisée.

    Je crains qu'il ne faille réinventer la roue afin de créer un format bien plus amateur mais aussi plus simple et économe.

    De fait, je vous remercie tous encore une fois, je reposte un message dès que j'ai quelque chose de correct.

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Au niveau GraphML tu n'as pas que des formats XML de définis.
    Pour le coup, le GML est moins lourd que du XML.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup, et sois-sûr que je te crois sur parole. Cependant, le problème est que je ne peux me lancer dans de telles expéditions (pourtant excitantes) en effet, je me dois de garder du temps pour les examens.

    Dans cette optique, j'ai créé un petit format trèèès artisanal mais qui comble amplement mes attentes. Il est basé sur l'une des deux représentations archi-classiques des graphes : la représentation par listes d'adjacences.

    Ainsi donc, si mon graphe non orienté est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1            7
     \          /
      2--4--5--6          
     /          \
    3            8
    le fichier texte pourrait avoir cette tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    1 : 2
    2 : 1 3 4
    3 : 2
    4 : 2 5
    5 : 4 6
    6 : 5 7 8
    7 : 6
    8 : 6
    "Pourrait" car l'ordre dans lequel apparaisse les sommets n'a pas la moindre importance.

    EDIT
    : Suppression des codes, je les remettrais sur le forum une fois les soutenances passées afin qu'ils puissent aider d'autres personnes.

  10. #10
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Pour ton test ça depend comment compare le contain de ton HashSet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(edge.equals(edgeb));
    c'est pas edgea ? ^^

    Pour voir si c'est le contain qui n'appelle pas ton equals fait une boucle qui parcourt les elements du HashSet et qui test si l'element en cour est egal à ton objet.

    Si ta boucle fonctionne c'est qu'il faut que tu fasses ta methode ou une surcharge du HashSet.

    Regarde dans le doc comment fonctionne contain dans HashSet .

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Node<String> nodea = new StdNode<String>("a");
    Node<String> nodeb = new StdNode<String>("b");
    Edge<String> edgea = new StdEdge<String>(nodea, nodeb);
    Edge<String> edgeb = new StdEdge<String>(nodeb, nodea);
    Set<Node<String>> set = new HashSet<Node<String>>();
    set.add(nodea);
    set.add(nodeb);
    Set<Edge<String>> set2 = new HashSet<Edge<String>>();
    set2.add(edgea);
    set2.add(edgeb);
    for (Edge<String> edge : set2) {
        System.out.println(edgeb.equals(edge) + " " + edgeb.compareTo(edge));
    }
    La doc me dit ceci :

    Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e))

    Que dois-je faire ? Hashcode, equals et compareTo sont consistantes, je n'ai plus d'idée.

    EDIT : je me suis fais ma propre méthode de comparaison, seulement, et forcément, je suis en O(n) plutôt qu'en O(1). Je perds les avantages de mon ensemble.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public boolean contains(Edge<E> edge) {
        if (edge == null) {
            throw new IllegalArgumentException();
        }
        for (Edge<E> e : edgesSet) {
            if (e.equals(edge)) {
    	    return true;
    	}
        }
        return false;
    }
    Alors que de base, j'avais seulement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean contains(Edge<E> edge) {
        return edgesSet.contains(edge);
    }

  12. #12
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    d'accord avant tu n'avais qu'une ligne mais que crois tu que la fonction faisait? pour un contain je pense qu'il parcourt les éléments aussi, surtout au vu de la doc où il cherche un element e correspondant.
    Ca fonctionne maintenant ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Aïe, pour moi l'intérêt d'avoir inventé une nouvelle structure (un ensemble), c'est de pouvoir tester l'appartenance d'un élément à ce dernier en temps constant (facilement reproductible en Turbo Pascal voire en C ou même en Ocaml d'ailleurs).

    De plus, quant aux collections de Java, ce site semble appuyer mon pressentiment : http://blog.xebia.fr/2011/02/17/java...n-performance/

    Maintenant, oui en effet, ça fonctionne, même très bien. Cependant, je suis intimement convaincu que je perds en vitesse (O(n) sur 10 éléments c'est bien, mais sur 100000, ça commence à se faire ressentir [à comparer avec du O(1)]).

    Enfin, et c'est surtout ce qui me gêne le plus, je ne comprends pas d'où vient l'erreur, et ça, ça m'ennuie vraiment.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Bon j'ai enfin compris.

    Pour ceux que ça intéresseraient encore, voici la solution :

    Soient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Node<Integer> node1  = new StdNode<Integer>(1);
    Node<Integer> node2  = new StdNode<Integer>(2);
    Edge<Integer> edgea = new StdEdge<Integer>(node1, node2);
    Edge<Integer> edgeb = new StdEdge<Integer>(node2, node1);
    Avec la méthode de hashcode que je vous ai présenté, ses valeurs diffèrent alors que edgea.equals(edgeb), ce qui n'est pas terrible (la preuve) puisqu'il est recommandé que x.equals(y) => x.hashcode() == y.hashcode().

    En effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    edgea.hashcode() == 1986
    edgeb.hashcode() == 2016
    C'était aussi bête que ça.

    Je vous remercie tous pour votre aide et merci encore à zhouyu pour sa pugnacité.

    Bonne soirée à vous.

    PS : il me semble d'ailleurs, maintenant que j'y pense, que quand on fait (en prenant l'exemple d'une table de hachage) ajouter(k, v), la JVM recherche k la clé avec k.hashcode().

  15. #15
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Merci pour la solution ça m'interpellait aussi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question pr graphe non oriente connexe
    Par anthony7788 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/06/2008, 20h28
  2. Géneration aléatoire de graphe non orienté connexe
    Par condor_01 dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 18/12/2007, 14h58
  3. Test de connexité sur graphe non orienté
    Par condor_01 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 25/10/2007, 00h01
  4. Plus court chemin - graphe NON orienté et pondéré
    Par Nicodemus dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 14/03/2006, 15h32
  5. algos sur graphes non orientés
    Par lechewal dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 05/01/2006, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo