簡體   English   中英

百分比和樹木

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM