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 :

Connaisance de Quicksort ..


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Connaisance de Quicksort ..
    Je sais que la politique ne veut pas que l'on fasse les exercices des autres ...
    Mais j'ai ici 3 questions dont je ne trouve réponse ... malgré que je sache comment fonctionne quicksort ...

    Je devrais être capable de répondre par oui ou par non et d'expliquer les questions suivantes :

    1. A cause des inégalités strictes des étapes suivantes :
    (11) WHILE t[i].clé < cléRef DO INC(i) END;
    (12) WHILE t[j].clé > cléRef DO DEC(j) END;
    l'étape suivante:
    (13) IF i <= j THEN tamp := t[i]; t[i] := t[j]; t[j] := tamp; INC(i); DEC(j) END
    fais parfois traverser une clé égale à la clé de référence.

    2. Le déplacement d’une clé égale à la clé de référence est inutile au tri.

    3. Donc la version de QuickSort obtenue en transformant (11) et (12) en :
    (11’) WHILE t[i].clé <= cléRef DO INC(i) END;
    (12’) WHILE t[j].clé >= cléRef DO DEC(j) END;
    est fonctionnelle et meilleure que la version de Hoare !

    J'ai fais des recherches sur internet. En vain ...
    Si vous connaissez un site qui puisse m'apporter des réponses à ces questions ou que vous êtes en mesure de m'aider .... merci ...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pour Quicksort et les améliorations qu'on peut lui apporter, une très bonne référence est le livre de Sedgewick sur les algorithmes.

    Le problème de ton approche, si on l'applique telle quelle dans l'algorithme classique, c'est que les deux pointeurs peuvent se croiser (suppose par exemple que ton fichier à trier ne contienne que des clefs égales...).

    Du coup, il va falloir ajouter une condition dans la boucle de recherche de pivot, qui va nettement ralentir l'algorithme (la vitesse de cette boucle est un des facteurs déterminants la rapidité de l'algorithme)...

    Tu pourrais néanmoins utiliser une inégalité stricte et une inégalité ou égalité dans ta boucle, ceci éviterait certains échanges, mais je crois que dans ce cas, tu risques de créer un biais, qui va produire des "coupes" moins équilibrées par pivot. Là encore, si on a des clefs égales, ca risque de ralentir le programme... (il faudrait faire les calculs)

    Maintenant, il existe des versions de quicksort qui prennent en compte les clef égales (en les stockant en début ou en fin de fichier, et en les remettant au milieu après chaque étape). Tu perds du temps dans cette gestion, toutes les valeurs égales au pivot sont éliminées des boucles suivantes (ça peut faire beaucoup...) Elles sont effectivement plus efficaces que le quicksort classique si on a peu de valeurs, mais elles sont plus lentes dans les autres cas...


    Quicksort est un algorithme bizzare. De petits changements de sa structure peuvent changer nettement ses performances. Dans ce genre de situation, il est très important d'effectuer des tests, sur des données pas du tout au hasard (les vraies données qu'on trie ne le sont jamais)...

    Francois

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par haribooo Voir le message
    1. l'étape suivante (...) fais parfois traverser une clé égale à la clé de référence.
    oui.

    2. Le déplacement d’une clé égale à la clé de référence est inutile au tri.
    sauf si c'est la référence elle même !

    Tableau de 7 valeurs, la référence est 8:
    {1,2,3,[8],7,5,9}

    Algo de Hoare => échange de 8 et 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {1,2,3,[8],4,5,9}
    i-------^    ^--j
    Cet échange est nécessaire pour que le tableau soit partitionné correctement.

    3. Donc la version de QuickSort obtenue en transformant (11) et (12) en :
    (11’) WHILE t[i].clé <= cléRef DO INC(i) END;
    (12’) WHILE t[j].clé >= cléRef DO DEC(j) END;
    est fonctionnelle et meilleure que la version de Hoare !
    Question sans objet vu la réponse a la question 2
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    oui.
    J'étais arrivé à la même conclusion. Je ne comprends juste pas pourquoi ?
    Comment expliquer ca ? ...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2009
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    sauf si c'est la référence elle même !
    Donc, on ne bougera pas un élément si il est égal à la clé ?

    Imaginons ce tableau :

    {2;4;6;2;9;6;7} ..

    Si nous prenons comme référence le premier élément comme clé ...
    Commençons donc à partir de la droite à la recherche d'un élément plus petit ou égal ... Une fois tombé sur le "2", devons nous le déplacé ?
    Parce que ensuite le "4" prendra l'ancienne place du "2", et le "2" que nous avions placé en clé de référence, prendra l'ancienne place du 4.

    .... Mon raisonement est-il faux ? Doit-on ignoré le 2 en passant dessus ? ...

    Parce que d'après ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHILE t[i].clé <= cléRef DO INC(i) END;
    WHILE t[j].clé >= cléRef DO DEC(j) END;
    Nous devons considérer les égalités, ou suis-je completement à coté de la plaque ?

    concernant le point "3" posté dans mon premier poste ...
    Je pense qu'elle est plus fonctionnelle et meilleure, non ? D'après ce que je viens d'avancer ...

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par haribooo Voir le message
    Donc, on ne bougera pas un élément si il est égal à la clé ?
    Au contraire : il faut toujours bouger la clé de référence, sinon le partitionnement peut devenir faux !

    Imaginons ce tableau :

    {2;4;6;2;9;6;7} ..

    Si nous prenons comme référence le premier élément comme clé ...
    Commençons donc à partir de la droite à la recherche d'un élément plus petit ou égal ... Une fois tombé sur le "2", devons nous le déplacé ?
    Parce que ensuite le "4" prendra l'ancienne place du "2", et le "2" que nous avions placé en clé de référence, prendra l'ancienne place du 4.

    .... Mon raisonement est-il faux ? Doit-on ignoré le 2 en passant dessus ? ...
    Dans l'algo de Hoare, le premier échange sera "2" (position 1 = la référence) avec "2" (position 4).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    initial: {[2],4,6,2,9,6,7}
     
    {[2],4,6,2,9,6,7}
    i-^      ^------j 
     
    swap 2 <-> 2
     
    {[2],4,6,2,9,6,7} 
    i----^----------j
     
    split
     
    {2} {4,6,2,9,6,7}
    Parce que d'après ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHILE t[i].clé <= cléRef DO INC(i) END;
    WHILE t[j].clé >= cléRef DO DEC(j) END;
    Nous devons considérer les égalités, ou suis-je completement à coté de la plaque ?
    L'algo avec les égalités est faux. Déjà il risque de provoquer des dépassements de tableau. Mais surtout, il faut absolument bouger la référence afin que le partitionnement soit correcte : c'est à dire que la partition basse ne contienne que des éléments inferieurs-ou-égaux à la référence, et que la partition haute ne contienne que des éléments supérieurs-ou-egaux à la référence.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Est-il possible de battre quicksort ?
    Par Grand sorcier dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/07/2006, 20h25
  2. algo de merge et quicksort
    Par jack_spyrow dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/06/2006, 12h21
  3. Tri : MergeSort est-il bcp plus lent que Quicksort ?
    Par phplive dans le forum Langage
    Réponses: 5
    Dernier message: 23/02/2006, 16h28
  4. débuter en c++ en ayant de bonnes connaisances du C
    Par heider dans le forum Débuter
    Réponses: 7
    Dernier message: 24/08/2005, 01h13
  5. QuickSort algo lequel ?
    Par sony351 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 05/08/2005, 10h55

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