Мне нужно реализовать текущую формулу. Это для подсчета узлов в таксономии. В принципе, оценка node зависит от количества дочерних узлов и их результатов ((nodes(h+1))
- количество узлов на следующем уровне, а Cl(concept)
- набор дочерних элементов).
В моем терминах использования частоты теперь определяются только для листьев. Я сделал реализацию, но проблема в том, что, когда для node есть 2 ребенка, реализация только идет в одну сторону.
Для данной таксономии:
1
/ \
2 3
| |
4 17
/ \
11 13
приведены частоты: freq(11) = 3
, freq(13) = 5
и freq(17) = 10
. Когда я пытаюсь получить оценку для node(1)
, результат 0.0
, потому что рекурсия не переходит в descendent 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
- хранит идентификатор узла и его уровень в таксономии
frequencies
- сохранить частоты для листовых узлов.
Я также создал фрагмент в Ideone: Источник
Как мне изменить код, чтобы он проходил по всем дочерним элементам для данного node?
UPDATE
Итак, теперь, в обновленном источнике, он пересекает всю таксономию, но результат все равно 0.0.