我有一棵无序的树。 每个节点代表一个可以完成(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%
计算此值的最佳方法是什么?感谢
答案 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