[英]Mathematical formula to a recursive method
我需要實現當前的公式。它用於對分類中的節點進行評分。 基本上,節點的得分取決於子節點的數量及其得分( (nodes(h+1))
是下一級別的節點數量,而Cl(concept)
是一組子節點)。
在我的用例中,術語頻率僅定義為現在的葉子。 我已經實現了一個實現,但問題是當節點有2個子節點時,實現只會轉到一邊。
對於給定的分類:
1
/ \
2 3
| |
4 17
/ \
11 13
給出freq(11) = 3
: freq(11) = 3
, freq(13) = 5
, freq(17) = 10
。 當我嘗試獲得node(1)
的得分時,結果為0.0
,因為遞歸不會進入后代node(4)
,它只檢索freq(17)
,就是它。 通常,結果應為7。
這是實施:
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy) {
float res = 0f;
int nodes = 0;
if (frequencies.containsKey(keyID)) {
return frequencies.get(keyID) + 0f;
}
for (Map.Entry<Integer, Integer> entry : subTaxonomy.entrySet()) {
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
nodes++;
res += calcScore(entry.getKey(), frequencies, subTaxonomy);
}
}
return 1 / nodes * res;
}
注意:
subTaxonomy
- 將nodeID及其級別存儲在分類中
frequencies
- 存儲葉節點的頻率。
我還在Ideone: Source創建了一個片段
我應該如何編輯代碼,以便它遍歷給定節點的所有子代?
UPDATE
所以現在,在更新的源代碼中,它遍歷所有分類法,但結果仍為0.0。
您的問題位於此行代碼中
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
樹的左側部分不符合您的預期約定,即childs id
(不是樹的葉子)遵循公式childs id = parents id - 1
我建議更改您的實現,包括分類中的parents id
而不是node level
。 可以在重復期間計算水平並將其作為另一個參數傳遞。
新簽名可能如下所示:
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy, int level)
您可以考慮從您的代碼中刪除level
信息,如果它不會影響您的最終結果!
正確的方法
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTax) {
float res = 0f;
int nodes = 1;
if (frequencies.containsKey(keyID)) {
return frequencies.get(keyID) + 0f;
}
for (Map.Entry<Integer, Integer> entry : subTax.entrySet()) {
if (entry.getValue() == keyID) {
res += calcScore(entry.getKey(), frequencies, subTax);
nodes++;
}
}
nodes--;
return (float)1 / nodes * res;
}
注意
subTax
- 是包含(child_id, parent_id)
的映射
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.