Formule mathématique à une méthode récursive

Je dois implémenter la formule actuelle. C’est pour scorer les nœuds dans une taxonomie. Fondamentalement, le score d’un nœud dépend de la quantité de nœuds enfants et leurs scores ( (nodes(h+1)) sont la quantité de nœuds du niveau suivant et Cl(concept) est un ensemble d’enfants).

Formule

Dans mon cas, les fréquences de terme ne sont définies que pour les feuilles à partir de maintenant. J’ai mis en œuvre une implémentation, mais le problème est que lorsqu’il y a 2 enfants pour le nœud, l’implémentation passe alors d’un côté.

Pour une taxonomie donnée:

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

les fréquences sont données: freq(11) = 3 , freq(13) = 5 et freq(17) = 10 . Lorsque j’essaie d’obtenir le score pour node(1) , le résultat est 0.0 , car la récursivité ne va pas dans node(4) descendant, elle ne récupère que freq(17) et le tour est joué. Normalement, le résultat devrait être 7.

Voici l’implémentation:

 public static float calcScore(int keyID, Map frequencies, Map subTaxonomy) { float res = 0f; int nodes = 0; if (frequencies.containsKey(keyID)) { return frequencies.get(keyID) + 0f; } for (Map.Entry entry : subTaxonomy.entrySet()) { if (entry.getValue() - 1 == subTaxonomy.get(keyID)) { nodes++; res += calcScore(entry.getKey(), frequencies, subTaxonomy); } } return 1 / nodes * res; } 

REMARQUE:

subTaxonomy – stocke le nodeID et son niveau dans la taxonomie

frequencies – stocke les fréquences pour les nœuds feuilles.

J’ai aussi créé un extrait chez Ideone: Source

Comment dois-je éditer le code, afin qu’il traverse les enfants pour un nœud donné?

METTRE À JOUR

Alors maintenant, dans le source mis à jour, il traverse toute la taxonomie, mais le résultat est toujours 0.0.

Votre problème est situé à cette ligne de code

 if (entry.getValue() - 1 == subTaxonomy.get(keyID)) { 

La partie gauche de votre arbre ne contient pas votre convention voulant que l’ childs id l’ childs id (qui n’est pas une feuille de l’arbre) suit la formule. childs id = parents id - 1

Je suggérerais de modifier votre implémentation en incluant l’ parents id dans votre taxonomie au lieu du node level du node level . Le niveau peut être compté pendant le recours et passé comme autre paramètre.

La nouvelle signature peut ressembler à ceci:

 public static float calcScore(int keyID, Map frequencies, Map subTaxonomy, int level) 

De plus, vous pouvez envisager de supprimer les informations de level de votre code si elles ne consortingbuent pas à votre résultat final!

Copie de la réponse du PO qui a été publiée dans la question

MÉTHODE CORRECTE

 public static float calcScore(int keyID, Map frequencies, Map subTax) { float res = 0f; int nodes = 1; if (frequencies.containsKey(keyID)) { return frequencies.get(keyID) + 0f; } for (Map.Entry entry : subTax.entrySet()) { if (entry.getValue() == keyID) { res += calcScore(entry.getKey(), frequencies, subTax); nodes++; } } nodes--; return (float)1 / nodes * res; } 

REMARQUE

subTax – est la carte contenant (child_id, parent_id)