百分比和树木

时间:2009-06-30 12:39:25

标签: math tree

我有一棵无序的树。 每个节点代表一个可以完成(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%

计算此值的最佳方法是什么?感谢

5 个答案:

答案 0 :(得分: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

如果这还不够,您可以为每项任务添加一个权重,并计算完成的重量除以总重量。

答案 1 :(得分:1)

对于任何节点, %done =后代叶子已完成/后代叶子总数

其中:

后代叶数=总和(儿童'后代叶数#)

答案 2 :(得分: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)
}

答案 3 :(得分:0)

这取决于您想要给每个级别的重量。如果我是你,我会选择你提到的第一种方法(即对同一级别的项目施加相同的权重),因此1%的50%对我来说是正确的,并且通过较慢的增加可以看到有更多节点的差异1.2节点的“完成”百分比。

要让一个节点影响更远的祖先,您可以将祖先百分比计算为其子树中所有叶子的平均值(这将使任务1的完成率达到33%),但这不会对我来说似乎很对。这一切都取决于你真正想要如何表示数据 - 我不认为这是一种'正确'的方式。

答案 4 :(得分:0)

我认为每个节点的百分比是它的子女(不是子孩子)百分比的平均值
例如

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