Bon tout d'abord calmons nous, je trouve le ton de ce post inutilement houleux.
Ensuite, soyons clairs, car apparement je me suis mal exprimé :
Cet algo se base sur la fréquence d'apparition des éléments d'un tableau pour le trier. C'est cela que je trouve astucieux, et non pas la manière dont est recherchée la fréquence des nombres.
Freq[ Tab[i] ]++;
Oui ça je suis d'accord c'est connu, utilisé par beaucoup depuis longtemps. Mais ça ce n'est que la moitié de l'algo, la moitié qui fait que Hercule considère que ce n'est pas un algo de tri mais un algo de statistiques.
Il n'empêche qu'en entrée je fourni un tableau d'entiers et que en sortie celui-ci est trié. Moi c'est ce que j'appelle un algo de tri.
Cet algo est exotique car il ne manipule pas les éléments triés, il les compte, d'où son nom de tri compteur.
Or dans la grande majorité des cas de tri, on ne tri pas des nombres pour le plaisir mais on tri des éléments en fonction d'une de leur caractéristique. Cet algo ne permet pas de faire cela (on ne peut pas par exemple trier une liste de personnes en fonction de leur age ... bien que ce soit des entiers short en plus) et a donc très peu d'utilités. Mais il peut en avoir une un jour pour quelqu'un ...
"Comment obtenir les 10 plus grands nombres d'une liste de 100000 ..." fiout, un petit tour de passe-passe et voila ma liste triée. Un des cas possibles cité par Feanor.
Alors je le donne en entier sous forme d'une fonction exploitable :
Code :
- bool TriCompteur(unsigned short * Tab, int size)
- {
- unsigned short * freq;
- unsigned short num;
- int i; /* index sur freq */
- int j; /* index sur Tab */
-
- freq = (unsigned short *) calloc(size, sizeof(unsigned short));
- if(freq == NULL) return false;
- /* Comptage */
- for(i = 0; i < size; i++) freq[i]++;
- /* Reconstitution du tableau trié */
- i = 0;
- j = 0;
- while(i < size)
- {
- num = freq[j];
- /* ajouter num fois j à la suite dans Tab */
- while(num > 0)
- {
- Tab[i] = j;
- i++;
- num--;
- }
- j++;
- }
- free(freq);
- return true;
- }
- (...)
- unsigned short TestTC[SIZE];
- (...)
- TriCompteur(TestTC, SIZE);
|
J'ai recherché la simplicité, pour être compréhensible par tous.
Bon, après les citations ...
Citation :
Ton truc ca sert à rien à part faire des stats
, alors au lieu de perdre du temps passe à autre chose...
|
J'utilise ton trie depuis 10 ans (je l'ai 3 fois rien que dans l'algo que je
suis en train de faire sur les vertices)
et je n'appel pas ca un trie parce que ce n'est pas un trie, c'est tout.[/quote]
Je te rassure, j'ai pas passé 10 ans sur cet algo, juste 10 minutes, puis je suis passé à autre chose ...
Et j'ai jamais dit que mon truc "servait à quelque chose". Mais je pense que ça a plus d'utilité que de calculer les décimales de Pi et ca y'en a qui y passent bcp de temps ...
Citation :
"500000 octets en qsort in t'en faut ... 500000 autres ... "
ou c'est que t'a vu ca.
|
vi vi c'est une boulette ... j'ai pas réfléchi suite à la lecture de ceci :
Citation :
Pour trier 50 octets en qsort tu n'as pas besoin de 256*4 octect, mais plutôt 50 autres entiers.
|
Du coup j'ai pas compris ce que tu as voulu dire ...
Citation :
bon ce qui precede prouve juste que tu es a la rue en algo..
le temps d'execution du tri quicksort est dans le pire des cas en theta de n^2 (n*n) ce qui est carré (polynomial) et non pas exponentiel. Ceci dit c'est tres mauvais pour un algorithme de tri. Ce qui le sauve c'est qu'en moyenne (sur tous les cas), il prendra un temps en n*log(n).
|
Exponentiel, j'ai dit ca au sens de "quelque chose qui croit de manière élevée", pas au sens mathématique. Bon c'est vrai que les 2 courbes n'ont pas la même gueule, mais j'avais à l'esprit d'être compris (tout le monde n'a pas étudié la complexité algorithmique ici ...) et je t'avoue que si ne pas savoir par coeur que le qsort est au max en theta de n^2 (n*n) mais en réalité plus proche de n*log(n), alors oui je suis à la rue.
Citation :
Moi je le trouvais intéressant à étudier. Je suis tout à fait d'accord que c'est presque impossible à utliser dans la vraie vie, mais n'empêche ca existe un algo de la mort qui tue pour trier 4 milliards d'octets en à peine plus du double d'opération + 1 Ko de RAM bouffée seulement + une facilité déconcertante à mettre en oeuvre ...
|
Citation :
Recalcule la place mémoire prise.
Certaines variantes du quicksort le font dans le tableau
d'origine, l'algo avec histogramme a besoin pour reconstituer la liste triee d'un tableau de taille au moins equivalente.
(ou alors tu es limité a un seul histogramme en bidouillant un peu, donc plutot inutile pour des entiers de plus de 16 bits)
|
c'est tout calculé ... un élément peut apparaître 4 milliards de fois ... un long pour stocker la fréquence d'un élément ... 256 éléments ... 256 * 4 = 1Ko.
Avec un tableau de 1Ko, on peut trier un tableau de 4 milliards d'octets ... et tres
rapidement ... en grosso modo 8 milliards d'operations (affectations).
le qsort ... log(4 milliards) = 22 en étant gentil. Le Qsort y'a au bas mot un echange par opération, et ca ça coute plus q'une affectation ... Dans le meilleur des cas, le qsort est 10 fois plus lents.
Apres je te suis pas ... pas besoin d'un tableau de taille equivalente ni de bidouille. Une fois l'histogramme de fait, le tableau source on en a plus besoin ...
on l'écrase avec sa version triée...
---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite