jQuery
En savoir plus
Adobe Flex & Flash
En savoir plus
ASP.NET
En savoir plus

| Page 1 | |||
| Pseudo | Commentaire | ||
|---|---|---|---|
| Page 1 | |||
Yno
|
# Posté le 18/04/2007 à 11:30:40 | ||
![]()
|
Bonjour,
J'ai cru remarquer une petite erreur : Citation : Tuto Donc ici, ces nombres sont 2 et 16.
Le nombre 16 n'apparaît pas dans ton tableau.
A part ça, je n'ai pas vraiment tout lu, je passais juste ici en vitesse, j'éditerai
A+ |
||
Nanoc
|
# Posté le 19/04/2007 à 21:06:57 | ||
Aimez-vous le C++ ?![]()
|
Hello,
Ton tuto est intéressant, mais je rajouterai 2 choses: 1) Le tri n'est pas vraiment en O(n), car si je prends la liste Code : Console -1000 0 1000
n=3 et il va pourtant falloir créer 2000 paniers en mémoire ce qui va prendre plus de temps que créer 3 paniers. Le tri serait plutot en O(n+m) ou m est la différence entre le plus grand et le plus petit élément à trier. 2) Ce tri est rapide mais il est par contre très mauvais au niveau de la taille en mémoire. Puisque il va falloir créer m paniers (où m est la différence entre le maximum et le minimum). Si par exemple je prends la liste, Code : Console -10'000'000 0 10'000'000
Je remplis 1GB de RAM (en C si je code mes nombres comme des int), pour une liste qui ne contient que 3 éléments (bien choisis il est vrai).
Voilà sinon ben: Secret (cliquez pour afficher) 16 Auteur d'un livre : Programmez avec le langage C++ Mes tutos : [C++] Cours officiel pour débutants, [C++] Manipulateurs de flux, [C++] Pointeurs sur fonctions, [C++] Maîtriser le compilateur g++, [C++] Déboguer avec Code::Blocks |
||
fredleshaman
|
# Posté le 19/04/2007 à 21:39:59 | ||
> fred-le-shaman@hotmail.com <![]()
|
Bravo, j'ai bien aimé ce tuto .
C'est une technique très séduisante, j'éspère que j'aurais un jour l'honneur de l'utiliser. ++ Fredleshaman n'est plus, si vous voulez vraiment le contacter, envoyer un e-mail à fred-le-shaman@hotmail.com . |
||
bluestorm
|
# Posté le 13/05/2007 à 23:13:23 | ||
dont ask to ask![]() Groupe : Anciens
|
Comme l'explique Nanoc, ce tri n'est pas du tout O(N).
En effet, la complexité de "calloc" est linéaire selon la taille de la mémoire demandée, et du coup tu as bien du O(N + max - min). De même pour ta boucle "for(i = 0; i <(max-min)+1; i++)". Il n'est pas donc pas forcément "rapide", et même "en général" très lent : si on prend des int au hasard (dans leur intervalle standard dans le langage qu'on utilise), il sera beaucoup, beaucoup, beaucoup plus lent qu'un tri par insertion, par exemple (qui lui-même n'est pas un tri de complexité optimale). Il n'est donc utile que dans le cas où on connaît une propriété très restrictive sur les valeurs qu'on nous donne à trier. En fait, il peut être étendu pour obtenir un tri linéaire sur n valeurs répartis dans un intervalle de taille n^2 par exemple, mais cela sort un peu de ton tuto et reste beaucoup moins général que le cas "tri d'entiers quelconques" que tu présentes. De plus, si l'on veut un tri stable, et qui fonctionne de manière un peu plus générique (au lieu de comparer directement des entiers, on trie un tableau de valeurs de type inconnu avec une fonction qui associe un entier à chaque valeur (par exemple à un grand nombre on associe la valeur de son dernier chiffre)), ça devient tout de suite beaucoup plus lourd (à coder), puisqu'il faut des listes dans chaque "panier" pour stocker les éléments. Honnêtement, je trouve que l'erreur au niveau du calcul de la complexité est très gênante : tu devrais essayer de la corriger au plus vite. |
||
GuilOooo
|
# Posté le 14/05/2007 à 18:35:34 | ||
Attention, je mords !![]()
|
Je suis désolé de pas m'être manifesté plus tôt, je n'avais pas assez de temps pour m'y mettre et ça m'est sorti de la tête. Donc, j'ai corrigé l'erreur de complexité c'est en validation. Ca devrait donc bientôt arriver.
C'est vrai que pour la complexité, j'ai pas l'habitude quand on a un calloc faut penser à l'initialisation. Mais pour ce qui est du tri d'éléments qui ne sont pas des entiers, ça peut s'adapter facilement: il suffit que les éléments soient comparables entre eux et que t'aies un tableau qui résume tous les états possibles. Mais en général on triera des entiers ou des objets en utilisant une propriété entière. Enfaite, c'était surtout pour présenter l'idée que j'ai écrit ça... Enfin merci de vos remarques !
|
||
Apobis
|
# Posté le 15/05/2007 à 18:18:40 | ||
|
Études : Télécom Bretagne |
Bon tuto, les explications sont claires. Je ne connaissais pas cette méthode en plus
|
||
bluestorm
|
# Posté le 17/05/2007 à 10:18:41 | ||
dont ask to ask![]() Groupe : Anciens
|
Oui, la complexité est bien mieux maintenant, merci
Citation Mais pour ce qui est du tri d'éléments qui ne sont pas des entiers, ça peut s'adapter facilement: il suffit que les éléments soient comparables entre eux et que t'aies un tableau qui résume tous les états possibles.
Mais justement, souvent résumer tous les états possibles n'est pas intéressant ou faisable (par exemple si je veux trier des flottants selon leur partie entière), et le tableau doit alors être plus lourdement modifié (au lieu de noter seulement les occurrences de chaque entier, on stocke les éléments qui correspondent à l'entier donné). |
||
woufeigh
|
# Posté le 20/05/2007 à 01:40:31 | ||
Webnul![]()
|
Heuh ce ne serait pas mieux de faire une liste chainée plutot qu'un tableau dynamique.
A chaque fois qu'on ne remplis pas le noeud, donc qu'on n'y met pas de jeton, on le supprime. Ca améliorera la taille mémoire. C'est ce que j'en ressort après une première lecture rapide Follow this link to get my resume: http://fulldev.eu/carlos-dasilva |
||
GuilOooo
|
# Posté le 20/05/2007 à 11:29:21 | ||
Attention, je mords !![]()
|
Citation : Blues' Mais justement, souvent résumer tous les états possibles n'est pas intéressant ou faisable (par exemple si je veux trier des flottants selon leur partie entière), et le tableau doit alors être plus lourdement modifié (au lieu de noter seulement les occurrences de chaque entier, on stocke les éléments qui correspondent à l'entier donné). sûr qu'en fait, c'est loin d'être adapté pour tout... Citation : woufeigh Euh ce ne serait pas mieux de faire une liste chaînée plutôt qu'un tableau dynamique. A chaque fois qu'on ne remplis pas le noeud, donc qu'on n'y met pas de jeton, on le supprime. Ca améliorera la taille mémoire. Ca dépend. Il faudra quand même allouer un grand nombre de paniers si la liste est très disparate. Donc le principal problème pour la mémoire reste : si on a des écarts de 100000 dans la liste, il faudra 100 000 paniers, soit environ 400 ko de mémoire... Même avec des listes chaînées. Et le truc c'est que la liste, on la reconstruira complètement depuis le début, qui qu'il arrive. Et ça prends aussi du temps de construire la liste. En plus, on va se retrouver avec deux listes : l'originale et une deuxième, la triée. Pour des listes énormes => deux fois plus de mémoire utilisée. Alors qu'avec un tableau, on peu le trier direct dans l'espace mémoire une fois qu'on a lu les paniers. Donc la solution ça serait de lire les paniers, de supprimer la liste, et de la reconstruire. Mais supprimer et reconstruire la liste ça prends quand même pas mal de temps, et, comme je l'ai dit plus haut, le problème des paniers subsiste. Donc c'est pas forcément mieux. |
||
landeguy
|
# Posté le 16/02/2008 à 22:04:46 | ||
|
Ou pas!
|
Le tuto est bien, la méthode de tri est surtout bonne avec des listes à chiffre répétitifs et pas éloignez. Ma note est 18 car c'est très très bien expliquer mais manue un peeu de fignolage .
Je suis en tain de faire un Zelda ammateur, si vous etes interresse(e) pour y participer envoyez moi un MP (je vais bientot en faire un topic) ![]() |
||
Silverlink
|
# Posté le 15/08/2008 à 12:48:59 | ||
|
Études : Ensimag |
Citation : GuilOooo La formule pour avoir le nombre d'entiers entre min et max est (min-max)+1. Et on obtient un bel entier négatif C'est juste une petite erreur d'inattention, mais bon ça m'a sauté aux yeux. Sinon le tuto est clair, bien que j'ai l'impression (et le calcul de complexité confirme) que ce code ne soit intéressant que dans des cas très particuliers... |
||
GuilOooo
|
# Posté le 15/08/2008 à 12:58:07 | ||
Attention, je mords !![]()
|
Hum exact .Pour une erreur si minime, je ne vais malheureusement pas corriger tout de suite. Je viens d'envoyer mon tuto à la validation pour une modficiation mineure, si je le refais ça risque de gonlfer les jaunes. Merci pour cette correction .
|
||
galopin_
|
# Posté le 22/03/2009 à 15:37:42 | ||
|
|
Allez parceque c'est vous, voila un code (C++) du radix sort, il marche peut importe les valeurs, sur des entiers et des floatant et est de loin plus rapide qu'un trie classique! Code : C++
|
||
GuilOooo
|
# Posté le 22/03/2009 à 16:48:42 | ||
Attention, je mords !![]()
|
Intéressant. Je n'ai pas testé pour le moment, faute de temps, mais j'ai tout de même une remarque : le radix sort trie les valeurs chiffre par chiffre, d'abord par unités, puis par dizaines, etc, de manière stable. Ce n'est pas la même chose qu'un tri par comptage, ou tri par paniers. |
||
galopin_
|
# Posté le 28/03/2009 à 14:40:36 | ||
|
|
Bien sur que si, le tri panier n'est qu'une spécialisation du radix, ou la base (radix) est déjà supérieur à ton range de valeur ![]() Et en informatique, oublie les dizaines, centaines and co, on travaille en base 2 ici on tri par octet!
|
||
elmcherqui
|
# Posté le 05/12/2009 à 03:28:49 | ||
la vie est un programme![]()
Ville : Casablanca |
galopin a raison le tri radix utilise le tri panier pour trier chaque chiffre vu que c'est decimal donc petit intervalle c'est tous benef . par contre tu peux choisir la base avec laquelle tu veux trier c'est pas forcement par octet ni tri par bit , generalement la decimale fait largement l'affaire ,parceque avec le binaire ce que tu va gagner en long tu va le perdre en large . pour choisir la base ideale c'est base = log nombre_element . (log de base deux ) . - La répétition est humaine , la récurrence Divine . - il faut être fou pour ne pas utiliser la récursivité quand il le faut ! |
||
quelqu'un du 86
|
# Posté le 05/08/2011 à 11:13:22 | ||
printf("Hello Zeros !\n");![]()
|
Très bon tutoriel, simple accessible complet. |
||
Pierroda
|
# Posté le 14/04/2012 à 11:51:31 | ||
![]() Avis : Bon
Ville : Verviers |
Avec une complexité O(N + (max-min)), tu bats tous les autres algorithmes, qui sont soit des O(n^2) ou des O (n log n). Il y a donc une erreur dans ton calcul de complexité.
|
||
shareman
|
# Posté le 14/04/2012 à 13:49:44 | ||
Faisons semblant![]()
|
Citation : Pierroda Avec une complexité O(N + (max-min)), tu bats tous les autres algorithmes, qui sont soit des O(n^2) ou des O (n log n). Il y a donc une erreur dans ton calcul de complexité. Tu te renseignes avant de conclure aussi vite ? Ça serait bien. En l'occurrence la limite pour les tris basés sur les comparaisons est de O(n log n) dans le cas général. Tu serais surpris d'apprendre qu'il existe des meilleurs des cas (pour les tris à comparaison) linéaires : - Smoothsort : au mieux en O(n), sinon en O(n log n) - Timsort : au mieux en O(n), sinon en O(n log n) - Et si on pousse à l'extrême, Insertion sort : au mieux en O(n), sinon en O(n²) Alors, mieux que O(n log n) donc ça n'existe pas ? Pour les tris qui ne sont pas basés sur les comparaisons, on a par exemple : - Counting sort (tri à paniers) : O(N + (max-min)) - Radix sort : O(kN) où k est la taille de la plus grande clef Honnêtement, ce n'est pas moi qui ai écrit ce cours, c'est GuilOooo, mais ça m'énerve de le voir commenté, jugé et noté par des gens qui ne s'y connaissent pas. Ce n'est pas un mal de ne pas s'y connaitre, mais si déjà, on ne se permet pas de juger ("donc il y a une erreur"... heu s'il te plait hein) Et si tu es d'accord, je veux bien que tu expliques ce qui ne t'a pas plu pour que tu mettes "mitigé". C'est ton droit, si tu ne veux pas te justifier, tu as le droit, mais je suis curieux.
|
||
Pierroda
|
# Posté le 14/04/2012 à 14:50:44 | ||
![]() Avis : Bon
Ville : Verviers |
shareman, je suis d'accord avec la seconde parie de ton message. En effet, je n'avais pas pensé que c'était un tri sans comparaison. Donc je suis d'accord : je me suis trompé. Par contre, concernant la première de ton message, tu triches un peu En effet, ça n'a aucun de parler d'analyse de complexité dans le meilleur cas. Dans le cas moyen ou dans le pire cas, c'est censé, mais pas dans le meilleur cas ! Car le Bubble Sort, le Selection Sort sont aussi linéaire dans le meilleur cas. Alors qu'en moyenne et dans le pire cas, ils sont quadratiques. Et je suppose que tu es d'accord pour dire que ces deux algorithmes font partie des moins efficaces des algorithmes de tri.
|
||
shareman
|
# Posté le 14/04/2012 à 15:05:00 | ||
Faisons semblant![]()
|
Moi je partais du principe que tu te disais "un comportement mieux que O(n log n), ça n'existe pas". Si ce n'est pas le cas, il y a eu malentendu, et effectivement ma première partie ne sert à rien, mais reconnais que ton commentaire portait à confusion à ce niveau-là Cependant, à titre informatif, le tri par sélection est toujours quadratique. Sinon je te mets bien sûr au défi d'en implémenter un qui ne le soit pas, mais qui reste tout de même un vrai tri par sélection. |
||
Pierroda
|
# Posté le 15/04/2012 à 22:24:11 | ||
![]() Avis : Bon
Ville : Verviers |
Ca portait bien à confusion, je suis d'accord. Quant au Selection Sort, tu as également raison : il est toujours quadratique
|
||
