我需要实现当前公式,这是为了对分类法中的节点进行评分。基本上,节点的分数取决于子节点的数量及其分数((nodes(h+1))
是下一级节点的数量,Cl(concept)
是一组子节点)。
在我的用例中,到目前为止,仅为叶子定义了频率。我已经实现了,但是问题是,当该节点有2个子代时,实现仅进行到一侧。
对于给定的分类法:
1
/ \
2 3
| |
4 17
/ \
11 13
给出了频率:
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
我应该如何编辑代码,以便遍历给定节点的所有子代?
更新
因此,现在,在更新的源中,它遍历了所有分类法,但结果仍然是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
信息!