2009-06-30 5 views
2

У меня есть неупорядоченное дерево. Каждый узел представляет задачу, которая может быть выполнена (1), а не выполнена (0) или имеет дочерние задачи.Проценты и деревья

Например:

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

Предположим, что листья 1.2.1, 3.1 и 5 сделано

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

Я хочу, чтобы вычислить процент завершенности каждого узла. Листья легко вычисляются с 0% или 100%, но как вычислить все остальные?

В настоящее время я иду по дереву с листьев, и каждый узел вычисляется на основе процента полноты детей. Например:

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

Теперь больше детей добавляется к 1.2 (это больше не лист, а узел). Если дети «не сделаны», 1.2 всегда 0%, и поэтому 1 составляет 50%, но я бы хотел, чтобы 1 был меньше, а затем 50%, так как, опустившись на своих детей и внуков, количество задач завершаться, чтобы сделать это на 100% больше!

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% 

Каков наилучший способ рассчитать это? Благодаря

+1

соглашаясь с большинством ответов все же, я думаю, что пока вы не присоединять систему weightage на основе, процент выполнения задачи в существующей системе, является точным. Нет. подзадач не должно иметь значения в процентном завершении основной (корневой) задачи. – Cerebrus

+0

Хорошо, предположим, что я строю машину с нуля. У меня есть узел «физически построить его» с 10.000 подзадачами и на том же уровне лист «выбирает имя». Я бы не сказал, что однажды решил назвать это «Oldsmobile2000», я на полпути! – pistacchio

+0

@Cerebrus: вы пытаетесь применить свою логику к своей проблеме. Если он хочет вычислить% сделано определенным образом, то по определению это правильный способ сделать это. Я думаю, что он должен добавить явный вес каждому узлу, но он неявно делает это, говоря, что каждый листовой узел имеет одинаковый вес. –

ответ

7

Вы можете определить% сделано в общей (суб) узлы сделаны, разделенное на общее число (суб) узлов. Подсчитывать только листья.

В этом случае:

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

Добавление дополнительных узлов:

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

Если этого недостаточно, вы можете добавить вес к каждой задаче и рассчитать законченную вес, деленный на общее число вес.

+0

Хороший ответ. Один граф стоит +1. –

0

вы могли бы попробовать с post order visit (псевдокод):

postorder(node) { 

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

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

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

Решение должно использовать только листовые узлы. Это не соответствует этому ограничению. –

+0

почему он должен использовать только листовые узлы? то есть * WRONG *, так как «я хочу рассчитать процент полноты *** каждого *** узла» – dfa

+0

Он хочет вычислить полноту каждого узла, да, но только листовые узлы рассчитывают на вес. Используя вашу логику, узел 1 вычислил бы 25% вместо правильных 33%. В качестве примечания, говорящего, что это действительно громко, вы не правы, просто громко. –

1

Для любого узла, % сделано = # потомка листьев сделано/общее кол-во потомка листьев

Где:

количество потомка листьев = СУММ (# детей игровая из потомков листьев)

0

Это зависит от веса, который вы хотите дать каждому уровню. Если бы я был вами, я бы выбрал первый метод, о котором вы упоминали (т. Е. Поставил тот же вес на предметы на одном уровне), поэтому 1 с 50% будет выглядеть правильно для меня, и разница в том, что больше узлов будет замечено более медленным увеличением от «сделанного» процента для 1.2 узла.

Чтобы получить узел повлиять на более далекие предок можно вычислить процент предка в среднем всех листики в поддереве (что дало бы завершения 33% для задачи 1), но это не кажется право на меня.Все зависит от того, как вы действительно хотите представлять данные - я не думаю, что есть «правильный» способ сделать это.

0

Я думаю, что процент каждого узла представляет собой среднее значение его дочерних (не дочерних) процентов.

Например

1_per = (1.1_per + 1.2_per)/2 
3_per = (3.1_per + 3.2_per + 3.3_per)/3 
Смежные вопросы