簡體   English   中英

數學公式為遞歸方法

[英]Mathematical formula to a recursive method

我需要實現當前的公式。它用於對分類中的節點進行評分。 基本上,節點的得分取決於子節點的數量及其得分( (nodes(h+1))是下一級別的節點數量,而Cl(concept)是一組子節點)。

式

在我的用例中,術語頻率僅定義為現在的葉子。 我已經實現了一個實現,但問題是當節點有2個子節點時,實現只會轉到一邊。

對於給定的分類:

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

給出freq(11) = 3freq(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創建了一個片段

我應該如何編輯代碼,以便它遍歷給定節點的所有子代?

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信息,如果它不會影響您的最終結果!

OPs答案的副本已發布到問題中

正確的方法

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM