Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1295 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Récursivité et vitesse

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récursivité et vitesse

n°647007
carot0
Posté le 18-02-2004 à 13:49:49  profilanswer
 

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
mood
Publicité
Posté le 18-02-2004 à 13:49:49  profilanswer
 

n°647011
chrisbk
-
Posté le 18-02-2004 à 13:50:38  profilanswer
 

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

n°647021
Taz
bisounours-codeur
Posté le 18-02-2004 à 13:53:55  profilanswer
 

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

n°647022
gilou
Modérateur
Modzilla
Posté le 18-02-2004 à 13:53:59  profilanswer
 

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é!  --
n°647024
Taz
bisounours-codeur
Posté le 18-02-2004 à 13:54:34  profilanswer
 

carrément :D

n°647275
carot0
Posté le 18-02-2004 à 15:29:55  profilanswer
 

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
n°647377
pascal_
Posté le 18-02-2004 à 16:17:29  profilanswer
 

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 ?
 

n°647383
Taz
bisounours-codeur
Posté le 18-02-2004 à 16:23:33  profilanswer
 

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
 

n°647397
carot0
Posté le 18-02-2004 à 16:34:49  profilanswer
 

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
n°647670
gilou
Modérateur
Modzilla
Posté le 18-02-2004 à 19:27:53  profilanswer
 

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é!  --
mood
Publicité
Posté le 18-02-2004 à 19:27:53  profilanswer
 

n°647800
HelloWorld
Salut tout le monde!
Posté le 18-02-2004 à 21:50:36  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°648300
pascal_
Posté le 19-02-2004 à 10:42:09  profilanswer
 

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.
 

n°648405
gilou
Modérateur
Modzilla
Posté le 19-02-2004 à 11:45:37  profilanswer
 

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é!  --
n°648514
HelloWorld
Salut tout le monde!
Posté le 19-02-2004 à 13:53:35  profilanswer
 

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
n°685445
marmotte.t​ranquille
Posté le 27-03-2004 à 00:35:40  profilanswer
 

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) ?

n°685447
Taz
bisounours-codeur
Posté le 27-03-2004 à 00:42:20  profilanswer
 

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

n°685450
marmotte.t​ranquille
Posté le 27-03-2004 à 01:02:29  profilanswer
 

Oui mais non :D
 
Avant le codeur statistique.

n°685452
Taz
bisounours-codeur
Posté le 27-03-2004 à 01:14:25  profilanswer
 

quoi ?

n°685455
marmotte.t​ranquille
Posté le 27-03-2004 à 01:34:38  profilanswer
 

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. :)

n°685578
Sylfurd
UUUURUTORAMAN §§
Posté le 27-03-2004 à 13:32:02  profilanswer
 

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


Message édité par Sylfurd le 27-03-2004 à 13:32:36
n°686987
marmotte.t​ranquille
Posté le 30-03-2004 à 00:19:38  profilanswer
 

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 :)

n°687009
gilou
Modérateur
Modzilla
Posté le 30-03-2004 à 01:34:18  profilanswer
 

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+,

n°687012
marmotte.t​ranquille
Posté le 30-03-2004 à 01:55:10  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Récursivité et vitesse

 

Sujets relatifs
De la vitesse des langages...Comment parametrer la vitesse d'un défilement de texte ??
Windows - vitesse de connexion au réseau localComment controler la vitesse des ventilos comme speedfan ?
[Visual Basic] Changer la vitesse du ventilateur cpu ?[Perl] Vitesse entre grep et defined
Vitesse d'exécution des dernières versions de DephiInclude / fonctions / vitesse d'execution
vitesse code php[OpenGL/C++] Vitesse de deplacement independante du fps :??:
Plus de sujets relatifs à : Récursivité et vitesse


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR