Récursivité et vitesse

Récursivité et vitesse - C++ - Programmation

Marsh Posté le 18-02-2004 à 13:49:49    

slt tlm, voila g créé une methode recursive pour scanner une arborescence sans rien oublier. apres pls test ma methode marche mais et elle tres lourde pour le processeur et pour la ram. j'aimerai savoir comment faire un code pour scanner une arborescence sans passer par la recursivité pour avoir un gain de performance.


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 18-02-2004 à 13:49:49   

Reply

Marsh Posté le 18-02-2004 à 13:50:38    

trop vague
explique ce que tu fais, comment, ptet un bout de code, machin, toussa quoi

Reply

Marsh Posté le 18-02-2004 à 13:53:55    

ouais bout de code, voir fonction entière, du moins les passages interessant (variables, et appels récursifs)

Reply

Marsh Posté le 18-02-2004 à 13:53:59    

Ben si c'est une arborescence que tu crées et dont tu controles la structure, tu devrais avoir moyen de réecrire ca de maniere itérative, non?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-02-2004 à 13:54:34    

carrément :D

Reply

Marsh Posté le 18-02-2004 à 15:29:55    

bon alors voila l'arborescence que je scan n'est pas cree par moi et je n'en connais pas la taille. il s'agit en fait du registre.

Code :
  1. void CRegistre::Scan(HKEY Cle,LPCTSTR souscle)
  2. {
  3. CRegistre Temps;//objet temporaire
  4. Temps.OuvrirCle(Cle,souscle);//ouverture d'une cle du registre
  5. for(int i=0;i!=Temps.EnumCle();i++)//EnumCle() retourne le nombre de ss cles trouvé ds la cle ouverte
  6. {
  7.  string temps=Temps.AfficheCle(i);//AfficheCle(i) retourne le nom des ss cle trouvé avec i comme index
  8.  Temps.Scan(Temps.CleOuverte(),temps.data());//recursivité
  9. }
  10. }


 
voila mon code j'espert que c pas trop bordelique


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 18-02-2004 à 16:17:29    

Déjà :


CRegistre Temps;//objet temporaire  
...
string temps=...


C'est vraiment pas terrible de mettre deux variables avec le meme nom  :fou:  :fou:  
 
Je suspecte fortement que tes problèmes viennent plus du fait des fonctions AfficheCle(i) et autres que de la récursivité. Faudrait voir leur code.
 
Essaye d'optimiser un peu ton code si tu as encore des problèmes :
Par exemple, tu calcul Temps.EnumCle() a chaque itération de la boucle
Temps.CleOuverte() ça serait pas obligatoirement egal a Cle par hasard ?
 

Reply

Marsh Posté le 18-02-2004 à 16:23:33    

je sais pas ce que tu peux faire avec ton Temps, mais avec temps, y a du travail a faire, tu peux sans doute gagner un peux en utilisant le constructeur par recopie temps(machin), voir meme tenter la référence const string &temps( machin );
 
évite de faire un apple à en EnumCle() à chaque passe, bref, pré-calcul tout ce que tu peux
 

Reply

Marsh Posté le 18-02-2004 à 16:34:49    

pascal_ a écrit :

Déjà :


CRegistre Temps;//objet temporaire  
...
string temps=...


C'est vraiment pas terrible de mettre deux variables avec le meme nom  :fou:  :fou:  
 
Je suspecte fortement que tes problèmes viennent plus du fait des fonctions AfficheCle(i) et autres que de la récursivité. Faudrait voir leur code.
 
Essaye d'optimiser un peu ton code si tu as encore des problèmes :
Par exemple, tu calcul Temps.EnumCle() a chaque itération de la boucle
Temps.CleOuverte() ça serait pas obligatoirement egal a Cle par hasard ?
 
 


merci tu avais raison le ralentissement vennait de EnumCle que je rappelais a chaque fois, g transformé mon code en ca :

Code :
  1. void CRegistre::Scan(HKEY Cle,LPCTSTR souscle)
  2. {
  3.    CRegistre Temps;//objet temporaire  
  4.    Temps.OuvrirCle(Cle,souscle);//ouverture d'une cle du  registre  
  5.    int nbCle = Temps.EnumCle();
  6.    for(int i=0;i!=nbCle;i++)//EnumCle() retourne le nombre de ss cles trouvé ds la cle ouverte  
  7.   {
  8.      string nomCle=Temps.AfficheCle(i);//AfficheCle(i) retourne le nom des ss cle trouvé avec i comme index  
  9.      Temps.Scan(Temps.CleOuverte(),nomCle.data());//recursivité  
  10.  
  11.   }
  12. }


 
ca marche nettement mieux


---------------
In a world without walls and fences, who needs Windows and Gates
Reply

Marsh Posté le 18-02-2004 à 19:27:53    

taz a écrit :

carrément :D

Euh oui, comme je le disais [C'est pas son cas, mais ca n'etait pas connu lorsque j'ai tapé ma reponse] quand tu maitrise la structure de donnée de ton arborescence, tu n'as pas besoin de faire de la recursivité pour parcourir un arbre.
 
 

Code :
  1. typedef struct Node {
  2.   NodeData *data;
  3.   struct Node *Father;
  4.   struct Node *FirstSon;
  5.   struct Node *NextBrother;
  6. } Node;
  7. void ProcessNode(Node *node);
  8. void ProcessTreeDepthFirst(Node *root)
  9. {
  10.   Node *current = root;
  11.   while (current)
  12.     {
  13.       ProcessNode(current);
  14.      
  15.       if (current->FirstSon)
  16.         current = current->FirstSon;
  17.       else if (current->NextBrother)
  18.         current = current->NextBrother;
  19.       else
  20.         {
  21.           current = current->Father;
  22.           while (current && !current->NextBrother)
  23.             current = current->Father;
  24.           if (current)
  25.             current = current->NextBrother;
  26.         }
  27.     }
  28. }


 
A+,


Message édité par gilou le 18-02-2004 à 19:31:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 18-02-2004 à 19:27:53   

Reply

Marsh Posté le 18-02-2004 à 21:50:36    

Ah beh ouai, si tu possèdes le père et le frère...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-02-2004 à 10:42:09    

HelloWorld a écrit :

Ah beh ouai, si tu possèdes le père et le frère...


 
tiens, je crois que c'est la première fois que je vois un arbre comme ça.
remarque c'est pas bete ça évite de se farcir une liste de fils.
 

Reply

Marsh Posté le 19-02-2004 à 11:45:37    

pascal_ a écrit :


 
tiens, je crois que c'est la première fois que je vois un arbre comme ça.
remarque c'est pas bete ça évite de se farcir une liste de fils.
 
 

Ben moi qui suis spécialiste es arbres structures, je peux te dire que ce type de structure est efficace si tu programme en C. Vas voir par exemple dans le code d'Amaya si tu veux une structure de ce type, utilisée IRL.
Bon, une vraie structure efficace, elle est comme ca en fait:

Code :
  1. typedef struct Node {
  2. NodeData *data;
  3. NodeId    id;
  4. Boolean   isLeaf;
  5. struct Node *Father;
  6. struct Node *FirstSon;
  7. struct Node *FirstSon;
  8. struct Node *NextBrother;
  9. struct Node *NextBrother;
  10. // Plus d'autres trucs selon ce a quoi te sert ton arbre
  11. // Par exemple, un pointeur sur une modele du noeud dans un schema XML si tu construit une arborescence XML  
  12. } Node;


 
Bon, faut optimiser la gestion memoire en allouant les noeuds par blocs et en réeutilisant les noeuds liberes...
Avec ce type de structure, tu peux coder le parcours d'arbre en avant et en arriere, en profondeur d'abord ou en largeur d'abord, sans faire de recursif.
 
A+,


Message édité par gilou le 19-02-2004 à 11:49:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-02-2004 à 13:53:35    

C'est l'exemple classique du chiox entre processeur et mémoire. Ta structure est 2 fois plus grosse, mais + rapide...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-03-2004 à 00:35:40    

gilou a écrit :


Bon, faut optimiser la gestion memoire en allouant les noeuds par blocs et en réeutilisant les noeuds liberes...
Avec ce type de structure, tu peux coder le parcours d'arbre en avant et en arriere, en profondeur d'abord ou en largeur d'abord, sans faire de recursif.


 
Je me permets de upper ce topic.
T'aurais pas des liens/astuces pour le codage d'arbres non équilibrés (en vue de compression) ?

Reply

Marsh Posté le 27-03-2004 à 00:42:20    

marmotte.tranquille a écrit :


 
Je me permets de upper ce topic.
T'aurais pas des liens/astuces pour le codage d'arbres non équilibrés (en vue de compression) ?

Huffman

Reply

Marsh Posté le 27-03-2004 à 01:02:29    

Oui mais non :D
 
Avant le codeur statistique.

Reply

Marsh Posté le 27-03-2004 à 01:14:25    

quoi ?

Reply

Marsh Posté le 27-03-2004 à 01:34:38    

Ben Huffman, c'est pour une compression statistique...
 
L'idée c'est de compresser l'architecture de l'arbre.
Avec un arbre normal pour chaque noeud tu as : valeur+fils+pere+voisin ca prend trop de place :o
 
Si tu as un arbre équilibré, tu peux stocker juste les valeurs dans un tableau et retrouver la position des fils/pères facilement.
 
Dans le cas d'un arbre non équilibré, je voulais savoir s'il y avait des astuces du genre. :)

Reply

Marsh Posté le 27-03-2004 à 13:32:02    

Réequilibrer l'arbre ? C'est assez efficace en général...


Message édité par Sylfurd le 27-03-2004 à 13:32:36
Reply

Marsh Posté le 30-03-2004 à 00:19:38    

Non non. Si l'arbre a cette forme, c'est voulu. (ou sinon faudrait déséquilibré l'arbre après :o )
 
J'ai trouvé quelques méthodes qui me conviendront (EZW, SPIHT pour les citer). Merci :)

Reply

Marsh Posté le 30-03-2004 à 01:34:18    

marmotte.tranquille a écrit :

Ben Huffman, c'est pour une compression statistique...
 
L'idée c'est de compresser l'architecture de l'arbre.
Avec un arbre normal pour chaque noeud tu as : valeur+fils+pere+voisin ca prend trop de place :o
 
Si tu as un arbre équilibré, tu peux stocker juste les valeurs dans un tableau et retrouver la position des fils/pères facilement.
 
Dans le cas d'un arbre non équilibré, je voulais savoir s'il y avait des astuces du genre. :)


Tu peux deja t'arranger pour ne maintenir un que pointeur pour le pere commun a un groupe de freres.
 
Pour chaque pere, tu vas avoir besoin de savoir ou est le premier fils a priori.
 
Mais si les reallocs ne te genent pas en cours de construction d'arbre, tu peux aussi t'arranger pour maintenir chaque groupe de noeuds freres comme un tableau, ce qui t'evitera de stocker les pointeurs sur le noeud voisin. Faut savoir gerer une marque de fin de tableau (pour laquelle, la case pointeur sur le premier fils correspondra alors a un pointeur sur la case noeud pere de ce groupe de freres) [si tu peux utiliser une valeur, que tu sais jamais attteinte par les valeurs que tu stockes dans ton arbre, c'est parfait comme marque de fin de tableau].
 
A+,

Reply

Marsh Posté le 30-03-2004 à 01:55:10    

gilou a écrit :


 
Pour chaque pere, tu vas avoir besoin de savoir ou est le premier fils a priori.
 


 
J'ai besoin aussi de la position des autres fils (ils ne sont pas forcément consécutifs et leur place est importante) et c'est ce qui m'embête le plus.
Sinon merci pour les autres idées.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed