coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 2012
-
25 août 2008 à 06:35
cs_nico1610
Messages postés395Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention19 juin 2009
-
15 sept. 2008 à 08:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_nico1610
Messages postés395Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention19 juin 20091 15 sept. 2008 à 08:41
Source amusante,
il est vrai qu'on apprend rapidement à utiliser une structure récursive pour gérer les arbres, simplement chainé ou doublement chainé.
Rapidement une classe node va avoir un (simplement) ou deux (doublement) pointeur sur d'autre classe node. Pour les simples, c'est généralement le suivant, pour les doubles on ajoute le précédent, ensuite on peu circuler dans la node sans problème. Il ne reste plus qu'a mettre les methodes del(), add(), move() ... et tout ce qui te paraitera utile.
Dans un chaine, il n'y a que deux elements maximum autour d'une node (le précedent et le suivant), le problème de l'arbre est qu'une node a comme dénominateur un parent qui peut être le méme que pour d'autre node. La solution reviens alors à soit faire un arbre simple (on indique que le parent) soit un arbre complexe, chaque node aura en reférence son parent mais aussi le nombre d'enfant qu'elle possède et au besoin un indexage.
Pour finir il faut, là aussi, ajouter les méthodes, un peu plus complexe:
-add_child() / ajouter un enfant
-add_same() / ajouter une node au même niveau
-del() / ne pas oublier que supprimer un parent doit aussi tuer tout ces enfants ! (je sais c'est mal mais c'est du code)
-move_up() / permet de remonter l'enfant au niveau de son parent
et toutes les méthodes qui peuvent être utile ...
Désolé pour mon français, j'ai beau me relire ça persiste!
Ergo.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 26 août 2008 à 12:19
Désolé... ^^ Mais j'adooooore les itérateurs...
Euh donc, logiquement, avec des itérateurs, ton code sera infiniment plus lisible, infiniment plus facile à maintenir, etc. Par contre, utiliser des itérateurs risque de faire passer le niveau de débutant à initié, et le code, s'il est plus lisible, ne sera pas forcément plus facile d'accès pour un débutant (précision : pour un débutant qui ne veut pas chercher à comprendre).
La classe RecursiveArrayIterator de la SPL est toute désignée pour manipuler des tableaux "récursifs".
http://www.php.net/~helly/php/ext/spl/
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDernière intervention 3 août 2010 26 août 2008 à 10:49
Je le savais, je me dis si je poste cette source on me demandera d'utiliser des itérateurs, des interfaces...
Je sais pas si avec un tableau le code est plus leger ou avec des itérateurs?
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 26 août 2008 à 10:17
Salut,
Puisque ta source est manifestement du PHP5, pourquoi ne pas utiliser des itérateurs ?
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDernière intervention 3 août 2010 25 août 2008 à 20:47
Je commence à comprendre ce que tu voulais me dire.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 25 août 2008 à 19:49
hum...
comme je l'ai dit dans mon message, tu peux faire en sorte que $node contienne un tableau d'objets Tree.
C'est ce qu'on fait generalement pour ce genre de choses, c'est beaucoup plus souple et beaucoup plus simple a manipuler.
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDernière intervention 3 août 2010 25 août 2008 à 19:35
La recursivité: je connais très bien. Mais d'après ce que je sache, on peut pas créer une structure avec PHP à part les classes. Je pourrais modifier la source en utilisant des listes chainées avec des classes mais je trouve cela plus lourd que d'utiliser un Array.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 25 août 2008 à 16:57
sa fonction listNode est recursive...
Palleas_44
Messages postés130Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 avril 2009 25 août 2008 à 16:49
Ah ouais, moi j'ai compris qu'il ne savait pas ce qu'était la récursivité, autant pour moi.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 25 août 2008 à 16:43
palleas_44, t'es hors sujet...
je parlais d'une structure qui contient un "pointeur" vers un autre element de cette structure
un peu comme une liste chainee.
pour un tableau, en general, on fait :
private $node = array();
mais $node contient un tableau d'objets Tree.
Palleas_44
Messages postés130Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 avril 2009 25 août 2008 à 10:58
15 sept. 2008 à 08:41
il est vrai qu'on apprend rapidement à utiliser une structure récursive pour gérer les arbres, simplement chainé ou doublement chainé.
Rapidement une classe node va avoir un (simplement) ou deux (doublement) pointeur sur d'autre classe node. Pour les simples, c'est généralement le suivant, pour les doubles on ajoute le précédent, ensuite on peu circuler dans la node sans problème. Il ne reste plus qu'a mettre les methodes del(), add(), move() ... et tout ce qui te paraitera utile.
Dans un chaine, il n'y a que deux elements maximum autour d'une node (le précedent et le suivant), le problème de l'arbre est qu'une node a comme dénominateur un parent qui peut être le méme que pour d'autre node. La solution reviens alors à soit faire un arbre simple (on indique que le parent) soit un arbre complexe, chaque node aura en reférence son parent mais aussi le nombre d'enfant qu'elle possède et au besoin un indexage.
Pour finir il faut, là aussi, ajouter les méthodes, un peu plus complexe:
-add_child() / ajouter un enfant
-add_same() / ajouter une node au même niveau
-del() / ne pas oublier que supprimer un parent doit aussi tuer tout ces enfants ! (je sais c'est mal mais c'est du code)
-move_up() / permet de remonter l'enfant au niveau de son parent
et toutes les méthodes qui peuvent être utile ...
Désolé pour mon français, j'ai beau me relire ça persiste!
Ergo.
26 août 2008 à 12:19
Euh donc, logiquement, avec des itérateurs, ton code sera infiniment plus lisible, infiniment plus facile à maintenir, etc. Par contre, utiliser des itérateurs risque de faire passer le niveau de débutant à initié, et le code, s'il est plus lisible, ne sera pas forcément plus facile d'accès pour un débutant (précision : pour un débutant qui ne veut pas chercher à comprendre).
La classe RecursiveArrayIterator de la SPL est toute désignée pour manipuler des tableaux "récursifs".
http://www.php.net/~helly/php/ext/spl/
26 août 2008 à 10:49
Je sais pas si avec un tableau le code est plus leger ou avec des itérateurs?
26 août 2008 à 10:17
Puisque ta source est manifestement du PHP5, pourquoi ne pas utiliser des itérateurs ?
25 août 2008 à 20:47
25 août 2008 à 19:49
comme je l'ai dit dans mon message, tu peux faire en sorte que $node contienne un tableau d'objets Tree.
C'est ce qu'on fait generalement pour ce genre de choses, c'est beaucoup plus souple et beaucoup plus simple a manipuler.
25 août 2008 à 19:35
25 août 2008 à 16:57
25 août 2008 à 16:49
25 août 2008 à 16:43
je parlais d'une structure qui contient un "pointeur" vers un autre element de cette structure
un peu comme une liste chainee.
pour un tableau, en general, on fait :
private $node = array();
mais $node contient un tableau d'objets Tree.
25 août 2008 à 10:58
25 août 2008 à 09:14
25 août 2008 à 06:35