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

Algorithmes et structures de données Discussion :

Dijkstra, encore lui ;-)


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 61
    Points
    61
    Par défaut Dijkstra, encore lui ;-)
    Bonjour à tous,

    Je vient d'implémenter l'algo de Dijkstra sous deux formes, avec un tableau, et avec un tas "normal" pas Fibonnaci... et à ma grande surprise ( ai-je tort ?) la version avec tableau est plus rapide que la version avec tas, pourtant la complexité en théorie est meilleur avec un tas !!! Qu'en pensez-vous ?

    Quand on fait un TP et qu'on est sensé faire tourner la deuxième forme plus vite que l'autre, on se pose des questions existentielles à vous rendre malade...( ex : Dois-je poursuivre mes études ? )....

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Augmente la taille et tu verras que le tas va passer progressivement devant. C'est une complexité en O(N²) par exemple pour l'un, mais cela peut être une vrai complexité égale à N²+ 2000N quand l'autre, c'est 1000Nlog(N) + N, donc le premier peut être plus rapide que le second sans aucun problème.

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    L'implémentation que tu as choisi pour un tas peut aussi jouer.

    Par exemple, si pour chaque cellule tu réalises des allocations (par exemple malloc en C), ça peut être couteux en temps. Mais normalement, avec des grandes valeurs, cet algorithme devrait prendre le pas sur la version tableau.
    Je ne répondrai à aucune question technique en privé

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Miles
    Augmente la taille et tu verras que le tas va passer progressivement devant. C'est une complexité en O(N²) par exemple pour l'un, mais cela peut être une vrai complexité égale à N²+ 2000N quand l'autre, c'est 1000Nlog(N) + N, donc le premier peut être plus rapide que le second sans aucun problème.
    Montrer ce fait -- qu'il y a des zones ou un algo de complexite plus grande peut etre plus rapide -- est peut-etre d'ailleurs un objectif de l'exercice. Ce qui peut etre amplifie par un probleme d'implementation comme le signale Millie.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 61
    Points
    61
    Par défaut
    j'ai utiliser un tas de Fibonacci de la librairie "JGraphT"...
    Et même avec ça, le tas est plus lent...sur des graphes de plus de 2000 sommets, et plus rapide sur des graphes de - de 1000 sommets ...
    J'y comprends plus rien, pourtant j'ai repris le même code du premier algo en tableau et j'ai juste changer la partie selection du prochain sommet ( le plus petit au sens de la distance ).

    J'ai même essayer une implémentation perso du Tas directement dans l'algo, histoire d'éviter les appels entre objets fréquents...et là c'est à peine si les deux sont égaux en temps d'execution...m'enfin ce sont les mystères de l'algorithmique qui font son charme

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Heu, une petite question qui peut paraître idiote : tu n'effectues pas un tri par tas à chaque itération, tu mets seulement à jour les positions des éléments dont tu modifies les distances dans la boucle la plus imbriquée ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par borisd
    Heu, une petite question qui peut paraître idiote : tu n'effectues pas un tri par tas à chaque itération, tu mets seulement à jour les positions des éléments dont tu modifies les distances dans la boucle la plus imbriquée ?
    non, pas de tri mais la méthode insérer du tas modifie elle même les positions des elements insérés afin de garder une structure de tas, forcément. Et ça c'est sensé prendre un temps en O(log n).

    Au départ le tas est vide, j'y insére le sommet de départ de l'algo, ensuite à chaque itération j'insére les succésseurs du sommet racine du tas en maintenant la structure du tas intacte.

    le pire est que quand j'intègre la gestion du tas dans la classe de l'algo, cela n'améliore pas assez la vélocité.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 61
    Points
    61
    Par défaut
    ça y est, j'ai trouver d'où provenait mon problème ...
    Je rajouter un sommet au tas même si le sommet y était déja...
    donc il refaisait des calculs déja fait, pour rien

    Ce qui me semble bizarre c'est que ça marchait...

    maintenant, le dijkstra en tas est plus rapide que le même avec un tableau...mais pas de beaucoup

Discussions similaires

  1. Macro VBA - Vlookup (Encore lui)
    Par Anto_NEX dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/08/2012, 10h18
  2. Erreur de script sous ie (encore lui!)
    Par steve3000 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2009, 20h28
  3. Huffman encore lui
    Par BatuBou dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 23/01/2008, 16h25
  4. segmentation fault (eh oui encore lui !)
    Par snipes dans le forum C
    Réponses: 8
    Dernier message: 11/12/2007, 17h22

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