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 :

Est-il possible de battre quicksort ?


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut Est-il possible de battre quicksort ?
    Ca fait des années que je me casse le crane à trouver meilleur que quicksort() et puis ne n'y arrive pas.

    Pourtant avant Hoare en 1960, les gens pensaient que le meilleur algo de tri etait le tri par insertion... Mais quand Hoare est arrivé il a pris tout le monde par surprise.

    Pensez-vous qu'il existe mieux que quicksort ?

    Mercenaire du code

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Grand sorcier
    Pensez-vous qu'il existe mieux que quicksort ?
    En 1994, j'avais trouvé cet article sur le A-Sort (nom donné par son auteur), dans la revue Pascalissime.

    Il me semble aussi avoir vu des tri en epi et des tri-fusion parfois plus rapide que quick-sort (bien que cela puisse peut-être dépendre de la distibution initiale.

    Le "Tri casier" est aussi un bon candidat pour être plus rapide que quick-sort.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Il me semble qu'on peut trouver des algorithmes plus performants en cas de distribution "aléatoire". Toutefois dans les pire des cas qui ont évidemment une probabilité faible (loi des grands nombre), on pourra avoir des temps longs. Ces algorithmes ne garantissent donc pas une performance correcte dans tous les cas.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le quicksort n'est pas un si bon tri... Théoriquement il est moins bon que le tri fusion, entre autres parce qu'il ne garantit pas une complexité en O(n log n) mais peut dégénérer en O(n²) dans le pire des cas (lorsque le tableau est déjà trié et qu'on choisit le pivot au début ou à la fin par exemple...), tandis que le tri fusion est garantit en O(n log n) et n'approxime pas mal le meilleur des tris (qu'on peut trouver à la main mais qui est trop irrégulier pour être bien programmé efficacement).

    Par ailleurs le tri par dénombrement ou par base sont bien meilleurs que le quicksort vu qu'ils sont en O(n) (dans certains cas), mais bien sûr ce ne sont pas des tris par comparaisons donc ils ne sont adaptés qu'à certains cas.

    La prédominance du quicksort s'explique surtout par son caractère "en place" (dans un univers où la mémoire comptait beaucoup jusqu'il y a peu) et son adéquation avec la structure de tableau, extrèmement répandue dans les langages de programmation bas niveau. La situation est en train de changer parce que les langages de haut niveau sont en train de se répandre, et que la mémoire est un facteur beaucoup moins déterminant aujourd'hui.
    Il faut voir aussi que les meilleurs algorithmes actuels sont en fait des mix employant des tris différent selon la longueur du tableau à trier, ils emploient souvent un dérivée du quicksort (ou du tri fusion) pour les gros tableaux mais choisisse le pivot de façon à éviter les cas dégénérés, ou coupe en plus que deux parts.

    --
    Jedaï

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Moi j'aime bien le quicksort car il ne consomme quasiment pas de mémoire. Seulement ses performances oscillent entre O(nlogn) et 0(n^2).

    De plus si j'ai une table qui prend plusieur Teraoctect et que je veux
    faire un tri sur une telle table, je suis obligé de travailler sur une portion
    de la table en mémoire. Mais la recursivité de quicksort parrait difficile
    a mettre en oeuvre dans de telles circonstances.

    Par contre la tactique "diviser pour regner" semble être très efficace. Au debut on prend une seule décision. L'itération d'après on prend 2 décisions. Puis 4, puis 8, etc....

    En fait il me faudrait un algo en O(n log n) quelque la tableau en entrée avec une consommation de mémoire faible...

    Mais en attendant je continue mes recherches fondamentales....

    Mercenaire du code

  6. #6
    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
    Si tu as plusieurs tera octets, les tris par fusion sont ce qui est classiquement utilise.

    Cherche "external sort" pour les tris quand tout ne tient pas en memoire.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Jedai
    Le quicksort n'est pas un si bon tri... Théoriquement il est moins bon que le tri fusion, entre autres parce qu'il ne garantit pas une complexité en O(n log n) mais peut dégénérer en O(n²) dans le pire des cas (lorsque le tableau est déjà trié et qu'on choisit le pivot au début ou à la fin par exemple...), tandis que le tri fusion est garantit en O(n log n) et n'approxime pas mal le meilleur des tris (qu'on peut trouver à la main mais qui est trop irrégulier pour être bien programmé efficacement).

    Par ailleurs le tri par dénombrement ou par base sont bien meilleurs que le quicksort vu qu'ils sont en O(n) (dans certains cas), mais bien sûr ce ne sont pas des tris par comparaisons donc ils ne sont adaptés qu'à certains cas.

    La prédominance du quicksort s'explique surtout par son caractère "en place" (dans un univers où la mémoire comptait beaucoup jusqu'il y a peu) et son adéquation avec la structure de tableau, extrèmement répandue dans les langages de programmation bas niveau. La situation est en train de changer parce que les langages de haut niveau sont en train de se répandre, et que la mémoire est un facteur beaucoup moins déterminant aujourd'hui.
    Il faut voir aussi que les meilleurs algorithmes actuels sont en fait des mix employant des tris différent selon la longueur du tableau à trier, ils emploient souvent un dérivée du quicksort (ou du tri fusion) pour les gros tableaux mais choisisse le pivot de façon à éviter les cas dégénérés, ou coupe en plus que deux parts.

    --
    Jedaï

    Effectivement ! Je viens de lire un bouquin d'algo et le tri fusion est
    garanti en O(nlog n) quelque soit la distribution du tableau.

    Je vai donc me mettre à implementer cet algo. Le seul problème
    est dans la fonction pour fusionner 2 tableaux triés. Il faudrait
    pouvoir faire ça directement en place sur le tableau...

    Mercenaire du code

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Le tri par tas est aussi en O(n log n)

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

Discussions similaires

  1. Est-il possible de bloquer le reverse engineering ?
    Par fugi dans le forum Assembleur
    Réponses: 39
    Dernier message: 31/07/2007, 02h33
  2. [IRC] -> Est-ce possible avec JBuilder ?
    Par MaTHieU_ dans le forum JBuilder
    Réponses: 4
    Dernier message: 26/08/2003, 17h24
  3. Réponses: 3
    Dernier message: 29/07/2003, 09h38
  4. Réponses: 2
    Dernier message: 16/05/2003, 10h14
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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