我需要实现当前公式,这是为了对分类法中的节点进行评分。基本上,节点的分数取决于子节点的数量及其分数((nodes(h+1))是下一级节点的数量,Cl(concept)是一组子节点)。

java - 递归方法的数学公式-LMLPHP

在我的用例中,到目前为止,仅为叶子定义了频率。我已经实现了,但是问题是,当该节点有2个子代时,实现仅进行到一侧。

对于给定的分类法:

     1
    / \
   2   3
   |   |
   4   17
  / \
 11 13

给出了频率:freq(11) = 3freq(13) = 5freq(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信息!

08-18 12:09
查看更多