trie par fusion - C++ - Programmation
Marsh Posté le 18-11-2002 à 10:30:28
les valeurs tordus de ce genre sont en général due à une erreur d'indirection ou d'allocation avec les pointeurs. (g lu le code et j'y comprends rien, mais g souvent des nombres pareils et c du à ca)
Marsh Posté le 18-11-2002 à 11:07:25
salut,
j'ai pas la reponse a ta question, par contre prend l'habitude de remplacer tes :
(a+b)/2 par (a+b) >> 1 si a et b sont des entiers.
Effectivement une division prend de 10 a 30 cycles au microprocesseur et un décalage a droite (qui l'équivalent d'une division par 2) de 1 a 2 cycles (plus les chiffres exactes en tete, mais les ordres de grandeur sont bons)
Marsh Posté le 18-11-2002 à 11:50:40
barbarella a écrit a écrit : par contre prend l'habitude de remplacer tes : (a+b)/2 par (a+b) >> 1 si a et b sont des entiers. |
Oui, prend l'habitude de faire du code incompréhensible, déjà que le C, c'est facilement le bordel, rajoute en encore.
Marsh Posté le 18-11-2002 à 11:56:12
kadreg a écrit a écrit : Oui, prend l'habitude de faire du code incompréhensible, déjà que le C, c'est facilement le bordel, rajoute en encore. |
Marsh Posté le 18-11-2002 à 22:02:42
barbarella a écrit a écrit : salut, j'ai pas la reponse a ta question, par contre prend l'habitude de remplacer tes : (a+b)/2 par (a+b) >> 1 si a et b sont des entiers. |
Il faut surtout prendre l'habitude d'optimiser a la fin! Voire laisser soin au compilo de faire ca tout seul.
Marsh Posté le 18-11-2002 à 22:03:31
weblook$ a écrit a écrit : snif! toujours pas de réponse à mon pbm |
Je veux bien jeter un oeil a ton code, mais pourrais tu expliquer en quoi ca consiste le tri par fusion? On m'a déja expliqué mais je ne me souviens plus.
Marsh Posté le 18-11-2002 à 22:33:37
barbarella a écrit a écrit : (a+b)/2 par (a+b) >> 1 si a et b sont des entiers. |
Ca c'était valable il y a quelques années. Les compilateurs modernes savent très bien détecter ces genres de cas. D'ailleurs on peut vérifier ca en activant la sortie assembleur de la compilation (sous Visual C++ c'est Project Settings / C++ / Preprocessor / Listing files je crois).
Si tu veux optimiser, apprends a connaitre ton compilateur, Luke !
Marsh Posté le 18-11-2002 à 23:06:50
Ace17 a écrit a écrit : Il faut surtout prendre l'habitude d'optimiser a la fin! Voire laisser soin au compilo de faire ca tout seul. |
c'est en rien une optimisation, faur arreter cinq minutes. c'est un opérateur.
Faut pas confondre optimisation et utilisation d'operateur.
Marsh Posté le 18-11-2002 à 23:08:31
fabsk a écrit a écrit : Ca c'était valable il y a quelques années. Les compilateurs modernes savent très bien détecter ces genres de cas. D'ailleurs on peut vérifier ca en activant la sortie assembleur de la compilation (sous Visual C++ c'est Project Settings / C++ / Preprocessor / Listing files je crois). Si tu veux optimiser, apprends a connaitre ton compilateur, Luke ! |
au lieu de donner des leçons, tu devrais essayé de sortir dans le vaste monde, et te rendre compte qu'il n'y pas que VC
Et c'est quoi cette aggressivité, j'ai donné un conseil, j'ai rien ordonné du tout, alors venez pas le prendre de haut.
Marsh Posté le 18-11-2002 à 23:41:16
barbarella a écrit a écrit : il n'y pas que VC |
J'ai essayé sur le gcc que j'ai au bureau (2.7.2, donc putoujeune), il fait aussi l'optimisation lui-même.
Marsh Posté le 19-11-2002 à 00:11:06
Juste une remarque, fais gaffe à tes intervalles. Le standard en C c'est que la borne initialle est incluse mais pas la borne de fin. Donc dans ce cas TriFusion deviens :
Code :
|
Marsh Posté le 19-11-2002 à 00:52:52
bon j'ai pas réussi à trouver l'erreur, mais je suis à peu prés certain qu'un problème d'adressage est en cause.
sinon j'ai réussi à faire ce que je voulais en modifiant le code de Fusion()
Pour les intéréssés:
Code :
|
Marsh Posté le 19-11-2002 à 04:16:37
L'erreur ne viendrait pas du fait que comme il ne respecte pas l'intervalle de son tableau (il faut mettre TriFusion(tab,0,TAILLE-1) dans ton main), il va dans trifusion chercher des valeurs dans des zones memoires bidon et donc du coup va les rapatrier dans son tableau tout beau?
Marsh Posté le 19-11-2002 à 04:17:59
Code :
|
J'ai eu la flemme de vérifier l'alorithme... désolé.
Citation : (a+b)/2 par (a+b) >> 1 si a et b sont des entiers. |
A condition que ce soient (1)des entiers (2)positifs représentés en (3)base 2 en (4)numération arabe.
Il faut coder l'opération qu'on veut faire, et laisser au compilateur ce genre d'optimisation.
Marsh Posté le 19-11-2002 à 06:58:33
barbarella a écrit a écrit : salut, j'ai pas la reponse a ta question, par contre prend l'habitude de remplacer tes : (a+b)/2 par (a+b) >> 1 si a et b sont des entiers. Effectivement une division prend de 10 a 30 cycles au microprocesseur et un décalage a droite (qui l'équivalent d'une division par 2) de 1 a 2 cycles (plus les chiffres exactes en tete, mais les ordres de grandeur sont bons) |
Le compilateur fait ca vraiment tres bien tout seul tu sais.
Remplacer /2 par >>1 , n'importe quel compilo bidon peux le faire.
Par contre, si tu veux produire du code incomprehensible, oui, fais comme ca.
Marsh Posté le 19-11-2002 à 09:44:00
Ai déja essayé mesurer différences de rapidité avec BC 3 sous Windows 3.11 sur mon 486/100MHz, car on voit mieux au chrono .
Multipl/divis par 2^n ou décalages, pas vu la moindre différence de rapidité. J'ai donc opté pour lecture facile.
Marsh Posté le 20-11-2002 à 23:56:28
ouf enfin c'est trouvé
c'était tout simplement des erreurs d'indice dans la fonction Fusion
Marsh Posté le 18-11-2002 à 01:31:58
j'essaye de realiser le trie par fusion mais ce code affiche des valeurs bidons!
pourquoi tout ma pourtant l'air correct?
les valeurs affichées sont du style '134554347 ... ...'