[英]Percentages and trees
我有一棵無序的樹。 每個節點代表一個可以完成(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 (1/2 = 50%)
/ \
1.1* 1.2
添加額外節點:
1 (1/3 = 33%)
/ \
1.1* 1.2 (0/2 = 0%)
/ \
1.2.1 1.2.2
如果這還不夠,您可以為每個任務添加一個權重,並計算完成的權重除以總權重。
對於任何節點,%done =已完成后代的葉子數 /后代葉子的總數#
哪里:
后代葉數=總和(兒童'后代葉數#)
你可以試一下訂單訪問 (偽代碼):
postorder(node) {
foreach(child : children) {
postorder(child)
node.visited++
if (child.completed == 1) {
node.completed++
}
}
print("%d%%", (node.completed / node.visited) * 100)
}
這取決於您希望為每個級別提供的權重。 如果我是你,我會選擇你提到的第一種方法(即對同一級別的項目施加相同的權重),因此1%的50%對我來說是正確的,並且通過較慢的增加可以看到有更多節點的差異1.2節點的'完成'百分比。
要讓一個節點影響更遠的祖先,你可以計算祖先百分比作為其子樹中所有葉子的平均值(這將使任務1的完成率達到33%),但這對我來說似乎不太合適。 這一切都取決於你真正想要如何表示數據 - 我不認為這是一種“正確”的方式。
我認為每個節點的百分比是它的子(而不是子子)百分比的平均值。
例如
1_per = (1.1_per + 1.2_per) / 2
3_per = (3.1_per + 3.2_per + 3.3_per) / 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.