2017-05-30 15 views
12

私は現在の式を実装する必要があります。これは、分類法でノードをスコアリングするためのものです。基本的に、ノードのスコアは、子ノードの数とそのスコアに依存します((nodes(h+1))は次のレベルのノードの数であり、Cl(concept)は子の集合です)。私のユースケース用語頻度で再帰的メソッドへの数式

Formula

だけ今のように葉のために定義されています。私は実装を行いましたが、問題はノードの子が2人いる場合、実装は片側だけになるということです。特定の分類のために

周波数が与えられている
 1 
    /\ 
    2 3 
    | | 
    4 17 
/\ 
11 13 

freq(11) = 3freq(13) = 5freq(17) = 10node(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 - 店舗ノードIDと分類

frequenciesでそのレベル - 周波数を保存しますリーフノードの場合。

私もIdeoneでスニペットを作成しました:それは与えられたノードのすべての子供たちの上に横断するようSource

は、どのように私は、コードを編集する必要がありますか?

UPDATEだから今

は、更新されたソースで、それはすべての分類学上の横断が、結果はまだ0.0です。

+0

を含むマップである、あなたは、そのレベルよりも大きい場合、すべてのノードを取得することができますあなたが地図から興味を持っているノードのレベル? – SomeDude

+0

@svasaはい、それは基本的に私がやっていることです。私は与えられたノードのレベルを取得し、トラバース中には1つ下のレベルにあるすべてのノードをチェックし、それらを子ノードとみなします。つまり、そのノードにメソッドを適用します。 – Cap

+0

'subTaxonomy.put(17、3);'ではないでしょうか? – c0der

答えて

1

あなたの問題は、このコード行に配置されて

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

(ツリーのリーフではありません)childs idが式に従うことを、あなたの意図された規則を保持していない、あなたの木の左部分childs id = parents id - 1

node levelの代わりに、タクソノミのparents idを含む実装への変更を提案します。レベルは、帰還中にカウントされ、別のパラメータとして渡されます。

新しいシグネチャは次のようになります。

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

さらにあなたはそれがあなたの最終的な結果に寄与しない場合は、あなたのコードからlevel情報をドロップするように検討することができます!

+0

! 'id == 4'のノードの' entry.getValue() 'は、' level'を通じた親の指定が不十分なため、再帰を止めさせます! – PrR3

+0

「レベル」は最終結果にどのような影響を与えますか?多分それを放置していますか? – PrR3

+0

ちょうどそれについてコメントしようとしていましたが、マップ '(子、親)'に格納するというアイディアを行っていました。私は最後にはレベルは必要ありません。私はちょうど子供のIDを提供して、それからさらに進むことができると思います。 – Cap

1

OPs answer that was posted into the question

正しいメソッドのコピー

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; 
} 

NOTE

subTaxは - 子供を取得するには(child_id, parent_id)

+0

そのコメントのために私を非難しないでください:問題を解決するためのプロセスがなくても、貴重なWikiのコンテンツ/これは、「バイナリ」回答で問題/質問を保持する可能性があります。仕様書には明確な答えが書かれていますが、ここに該当する場合は...(デザインが重要な部分です) – PrR3

+0

@ PrR3、私の謝罪。通常、私はあなたの答えを受け入れましたが、モデレータの中には私の解決策を追加の回答としていました。おそらく、誤って受け入れられました。 – Cap

+0

@Cap絶対に問題ありません!両方の答えの組み合わせが私の意見で最も価値があるでしょう。 – PrR3

関連する問題