IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Transformer algorithme récursif en itératif


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut Transformer algorithme récursif en itératif
    Bonjour,

    Désolé si ce topic a plutôt sa place dans le forum Algorithmique, mais étant donné qu'il utilise certaines notations de Zend et du PHP j'ai préféré le mettre ici, surtout que ce n'est sûrement pas bien difficile, mais je bloque.

    Voilà, je dispose d'un forum avec de très nombreuses catégories, sous catégories, sous-sous catégories et ainsi de suite.

    J'ai réussi à écrire l'algorithme pour établir ma hiérarchie à base de tableaux, toutefois je n'ai réussi qu'à faire une fonction récursive (plus simple à visualiser), j'aimerais savoir si vous pourriez m'aider (si c'est possible évidemment) à la transformer en fonction itérative, ce qui est sûrement plus performant (j'ai potentiellement énormément de catégories). J'ai pensé aux closures mais je ne les maîtrise pas.

    Voici la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    protected function _createCategoryHierarchy($parentId = null)
    {
        $hierarchy = array();
     
        $categoryPaginator = $this->categoryMapper->getByParentId($parentId);
        $categories = $categoryPaginator->getItems(0, -1);
     
        if (!empty($categories))
        {
            foreach($categories as $category)
    	    $hierarchy[] = array('category' => $category, 'subCategories' => $this->_createCategoryHierarchy($category->id));
        }
     
        return $hierarchy;
    }
    Le getItems se contente de renvoyer tous les éléments, vous pouvez ignorer le paginateur .

    Par exemple, avec une catégorie mère et deux catégories filles, j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    array(1) {
      [0] => array(2) {
        ["category"] => object(Application_Model_ForumCategory)#79 (1) {
          ["_properties":protected] => array(4) {
            ["id"] => string(1) "5"
            ["parentId"] => NULL
            ["name"] => string(5) "Cat 1"
            ["description"] => string(7) "Cattt 1"
          }
        }
        ["subCategories"] => array(2) {
          [0] => array(2) {
            ["category"] => object(Application_Model_ForumCategory)#82 (1) {
              ["_properties":protected] => array(4) {
                ["id"] => string(1) "6"
                ["parentId"] => string(1) "5"
                ["name"] => string(5) "Cat 2"
                ["description"] => string(7) "Cattt 2"
              }
            }
            ["subCategories"] => array(0) {
            }
          }
          [1] => array(2) {
            ["category"] => object(Application_Model_ForumCategory)#83 (1) {
              ["_properties":protected] => array(4) {
                ["id"] => string(1) "7"
                ["parentId"] => string(1) "5"
                ["name"] => string(5) "Cat 3"
                ["description"] => string(7) "Cattt 3"
              }
            }
            ["subCategories"] => array(0) {
            }
          }
        }
      }
    }
    Merci de votre aide .

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    Citation Envoyé par Bakura Voir le message
    j'ai potentiellement énormément de catégories
    est ce que tu peux essayer ton code en conditions réelles pour mesurer les performances ?
    je demande ça parce que ce mois, j'ai fait un code qui avait l'air de de consommer beaucoup de ressources mais après avoir testé avec les données finales, le traitement que j'aurais pu optimiser mettait moins d'un vingtième du temps de génération de la page. donc je suis passé à la suite et j'ai mis cette optimisation dans la liste "à faire plus tard"

    en faisant des tests tu pourras voir si c'est la construction qui prend le plus de temps ou alors les requêtes dans la base de données par exemple ?
    toujours dans la même application, j'ai voulu optimiser un bout de code pour sélectionner seulement les éléments de l'arborescence et au final, j'ai gardé le bout de code qui cherche tout le contenu de la table même si la moitié n'est pas utilisé

    d'ailleurs ça me fait penser à une astuce que j'utilise dans toutes mes arborescences c'est ça :
    http://sqlpro.developpez.com/cours/arborescence/

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Merci pour ce lien très intéressant ...

    D'autre part en relisant mon code, je me suis aperçu que, puisque au final je récupère toutes les catégories, je peux faire un fetchAll (donc une seule requete), plutôt que énormément de requêtes SQL comme actuellement.

    Merci

Discussions similaires

  1. algorithme récursif et itératif
    Par amateurc dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 14/11/2009, 01h02
  2. Algorithme récursif (Poker)
    Par MagicTux dans le forum Débuter
    Réponses: 5
    Dernier message: 31/01/2009, 14h12
  3. Algorithme récursif de calcul de moyenne
    Par kromartien dans le forum Mathématiques
    Réponses: 25
    Dernier message: 23/10/2007, 11h05
  4. [SQL] Tree : algorithme récursif
    Par Fabouney dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/08/2007, 15h39
  5. problème algorithme récursif
    Par seb888 dans le forum Général Java
    Réponses: 11
    Dernier message: 04/06/2005, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo