2009-06-30 8 views
2

J'ai un arbre non-ordonné. Chaque nœud représente une tâche qui peut être effectuée (1), non effectuée (0) ou qui a des tâches enfants.Pourcentages et arbres

Par exemple:

1 
-1.1 
-1.2 
--1.2.1 
--1.2.2 
-1.3 
2 
3 
-3.1 
4 
-4.1 
--4.1.1 
5 

Supposons que les feuilles 1.2.1, 3.1 et 5 sont fait

1 
-1.1 
-1.2 
--1.2.1* 
--1.2.2 
-1.3 
2 
3 
-3.1* 
4 
-4.1 
--4.1.1 
5* 

Je veux calculer le pourcentage de l'intégralité de chaque nœud. Les feuilles sont facilement calculées avec 0% ou 100%, mais comment calculer tous les autres?

À l'heure actuelle, je marche l'arbre à partir des feuilles et chaque nœud est calculé sur la base du pourcentage d'exhaustivité des enfants. Par exemple:

1  50% 
-1.1* 100% 
-1.2 0% 
2  0% 
3  33% 
-3.1* 100% 
-3.2 0% 
-3.3 0% 

Maintenant, plus d'enfants sont ajoutés à 1,2 (qui est plus une feuille, mais devient un nœud). Si les enfants ne sont pas "faits", 1.2 est toujours 0% et donc 1 est 50%, mais j'aimerais que 1 soit moins puis 50%, comme, descendant dans ses enfants et petits-enfants le nombre de tâches à être complété afin qu'il soit fait à 100% est plus grand!

1  50% 
-1.1* 100% 
-1.2 0% 
--1.2.1 0% 
--1.2.2 0% 
2  0% 
3  33% 
-3.1* 100% 
-3.2 0% 
-3.3 0% 

Quelle est la meilleure façon de le calculer? Merci

+1

Désaccord avec la plupart des réponses encore, je pense que jusqu'à ce que vous attachez un système à base de weightage, le pourcentage d'achèvement des tâches dans votre système existant est exacte. Le non. des sous-tâches ne devrait pas avoir d'importance dans le pourcentage d'achèvement de la tâche principale (niveau racine). – Cerebrus

+0

Eh bien, supposons que je construis une voiture à partir de zéro. J'ai le noeud "physiquement construit" avec 10.000 sous-tâches et au même niveau la feuille "choisissez un nom". Je ne dirais pas que, une fois décidé de l'appeler "Oldsmobile2000", je suis à mi-chemin! – pistacchio

+0

@Cerebrus: vous essayez d'appliquer votre logique à son problème. S'il veut calculer le% fait d'une certaine manière, alors par définition c'est la bonne façon de le faire. Je pense qu'il devrait ajouter un poids explicite à chaque nœud, mais il le fait implicitement en disant que chaque nœud de feuille a un poids égal. –

Répondre

7

Vous pouvez définir le% fait en totale (sous) nœuds fait divisé par le total des nœuds (sous). Compter seulement les feuilles.

Dans ce cas:

 1 (1/2 = 50%) 
    /\ 
    1.1* 1.2 

Ajout des nœuds supplémentaires:

 1 (1/3 = 33%) 
    /\ 
    1.1* 1.2 (0/2 = 0%) 
     /\ 
    1.2.1 1.2.2 

Si cela ne suffit pas, vous pouvez ajouter un poids à chaque tâche et de calculer le poids complété divisé par le total poids.

+0

Bonne réponse. Le graphique seul vaut le +1. –

0

vous pouvez essayer avec un post order visit (pseudo-code):

postorder(node) { 

    foreach(child : children) { 
     postorder(child) 
     node.visited++ 

     if (child.completed == 1) { 
      node.completed++   
     } 
    } 

    print("%d%%", (node.completed/node.visited) * 100) 
} 
+0

La solution ne doit utiliser que les nœuds feuilles. Cela ne respecte pas cette contrainte. –

+0

pourquoi il devrait utiliser seulement des nœuds de feuille? c'est * WRONG * depuis "Je veux calculer le pourcentage de complétude de *** chaque nœud ***" – dfa

+0

Il veut calculer l'exhaustivité de chaque nœud, oui, mais seuls les nœuds feuilles comptent pour le poids. En utilisant votre logique, le nœud 1 calculerait à 25% fait au lieu du 33% correct. Comme une remarque, dire très fort ne vous rend pas juste, juste fort. –

1

Pour tout noeud, % DONE = Nombre de descendants laisse # done/total des descendants quitte

Où:

nombre de descendants laisse = somme (# enfants de feuilles descendant

0

Cela dépend du poids que vous voulez donner à chaque niveau. Si j'étais vous, je choisirais la première méthode que vous avez mentionnée (ie mettre le même poids sur des objets du même niveau) donc 1 avec 50% me semblerait juste et la différence d'avoir plus de nœuds serait vue par une augmentation plus lente de 'fait' pourcentage pour 1.2 noeud.

Pour obtenir un nœud à affecter les ancêtres plus lointains, vous pouvez calculer le pourcentage des ancêtres en moyenne de tous les leafs dans son sous-arbre (qui donnera l'achèvement de 33% pour la tâche 1), mais cela ne semble pas tout à fait juste pour moi.Tout dépend de la façon dont vous voulez vraiment représenter les données - je ne pense pas qu'il y ait une «bonne» façon de le faire.

0

Je pense que le pourcentage de chaque nœud est la valeur moyenne de ses pourcentages d'enfants (pas de sous-enfants).

Par exemple

1_per = (1.1_per + 1.2_per)/2 
3_per = (3.1_per + 3.2_per + 3.3_per)/3 
Questions connexes