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

C Discussion :

Quicksort récursif, condition d'arrêt le probleme ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut Quicksort récursif, condition d'arrêt le probleme ?
    Bonjour,

    Dans le cadre d'un projet d'informatique sur les algorithmes génétiques, j'ai du faire une fonction Quicksort, elle marche mais le problème c'est quand la population a un trop grand nombre d'individus, là ca rame énormément et après le processus s'arrête sans arriver à terme et je ne trouve pas d'ou vient le probleme.
    Je sais que sans tout le reste du projet, c'est difficile de pouvoir m'aider mais peut-etre qu'en jetant un oeil a ma fonction Quicksort, vous pourriez voire un petit problème de la gestion de la mémoire ou quelque chose du genre qui ferait que j'ai un problème quand le nombre devient trop important... à moins que le problème n'est pas vraiment la taille de la liste mais peut-être un autre problème vu que si la liste est plus grande, il y a plus de chances d'avoir une valeur qui ne fonctionne pas avec ma fonction... Je pencherais meme plus pour ca vu que j'ai essayé plusieurs fois avec une meme taille et un coup ca avait passé nickel...

    Merci
    Bonne après-midi..


    Je pense avoir localisé le problème, j'ai placé un printf("b"); dans le dernier else (ou on rappelle la fonction récursivement) et j'ai observé que quand ca fonctionnait pas, j'avais plein de bbbbbbbb qui s'affichait jusqu'à quand ca plante... ca doit tourner en rond ? Mais je comprends pas pourquoi

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    je pense que tu dois exploser la pile de fonction.

    je ne sais pas comment est declaré le type Population, mais essaye (si c'est pas un pointeur "masqué") de passer un pointeur sur Pop, plutot que Pop ...

    si ça marche toujours pas ...
    je pense que tu vas devoir re-ecrire ton algorithme en iteratif.

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Bon beh je confirme le problème ne vient pas de la taille de la liste de départ que je passe mais le problème est au niveau de la fonction, dans la dernière boucle else, car parfois ca tourne en rond, ca ne s'arrete jamais, d'ou le plantage...

    Quelqu'un pour m'aider ?

    Merci Bonne fêtes de fin d'années...

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Dark_Ebola
    (si c'est pas un pointeur "masqué")
    Si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Population p=Pop;
    [...]
    p->next = NULL;
    Comment est généré ta liste à trier ? Il semblerai que tu tombe sur le pire des cas (liste totalement dans le désodre, par exemple) ce qui t'oblige à faire de nombreuses permutations et fait exploser la pile (ou dû moins ralenti ton programme).

    sachant qu'il faut compter 3 variables de type Population par appel et que la taille de la pile s'exprime en kilo-octects (je viens de voir sur http://support.microsoft.com/ la valeur de 64 ko mais ce n'est qu'un exemple) tu peux vite savoir si tu explose la pile

    Le mieux serait de revoir l'algo en commençant par le dé-récursifier

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Euh déjà c'est quoi un pointeur masqué ?
    Désolé mais je débute, c'est mon premier projet d'info

    La liste est générée automatiquement, je ne sais pas comment expliquer, il faudrait que je mette toutes les fonctions avec mais cela revient presque à mettre tout le projet et je pense pas que quelqu'un ait vraiment le temps et l'envie de regarder mon projet entier, même s'il n'est pas très gros.

    L'ennui c'est que l'énoncé est fait pour qu'on fasse cette fonction de façon récursive...

    Mais le problème je pense, viens du fait que parfois ca appel continuellement la fonction sans s'arrêter,(ca reste dans le dernier else à l'infini) ca n'atteint pas la condition d'arrêt et d'ailleurs je ne comprends pas pourquoi. Peut etre que ma fonction pour séparer deux listes est mal faite ? :

    Merci de votre aide...

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Re Bonsoir,

    Etant parti dans tous les sens au début, je vais essayer de redéfinir mon problème maintenant que je pense l'avoir localisé...

    Donc pour commencer par le début : j’ai un projet d’info sur les algorithmes génétiques, dedans je dois faire un tri : le tri Quicksort de façon récursive…

    Je travaille avec des listes chaînées.


    Dans cette fonction Quicksort, j’utilise une autre fonction « separer » (qui permet de séparer une liste en 2 sous listes) et une fonction « fusion » (qui permet de coller 2 listes chaînées).

    Alors mon problème c’est que des fois ma fonction Quicksort bug… en plaçant des printf dedans pour voir ou pouvez venir le problème, j’ai vu que parfois, la fonction s’appelait sans arrêt, les conditions d’arrêt ne sont jamais atteintes… mais ca je n’arrive pas à le comprendre, pour moi les conditions d'arrêt sont vraiments bien, peut-être incomplètes mais je ne sais pas…

    A moins que le probleme vient d’une des 2 autres fonctions que j’utilise dedans mais j’ai fait pas mal d’essai avec et ca a toujours fonctionné donc je reste sur l’idée que le problème vient de la fonction Quicksort récursive qui, des fois, ne s’arrête pas et donc ca plante !!




    Merci à vous

    Bonnes fêtes

  7. #7
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    tu devrais essayer de suivre le deroulement de ton programme grace a un debugger en mode "pas a pas".

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par gege2061
    Le mieux serait de revoir l'algo en commençant par le dé-récursifier
    Ca, c'est fonctionner à l'envers. Quick sort est un algorithme récursif et pas une itération cachée. Tant qu'il ne fonctionne pas, le dé-récursifier n'a aucun intérêt. On peut penser à le faire si effectivement on a vérifié que la pile explose.

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    ca y est j'ai trouvé le probleme

    merci quand meme

    ++

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

Discussions similaires

  1. Condition correcte mais pose probleme
    Par Vincinho dans le forum Visual Studio
    Réponses: 2
    Dernier message: 12/11/2009, 11h32
  2. Problème condition d'arrêt boucles while et for
    Par Clairette29 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/06/2008, 11h51
  3. Condition d'arrêt des boucles
    Par Pingu1 dans le forum MATLAB
    Réponses: 6
    Dernier message: 18/06/2007, 09h19
  4. [TP] Condition d'arrêt = touche escape
    Par gadalla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 10/05/2007, 13h38
  5. [VB.NET]Boucle infinie et condition d'arrêt
    Par Benbedo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 31/07/2006, 09h20

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