package com.alibaba.simpleimage.analyze.search.util; import java.util.LinkedList; import java.util.List; import com.alibaba.simpleimage.analyze.search.cluster.Clusterable; import com.alibaba.simpleimage.analyze.search.tree.KMeansTreeNode; public class TreeUtils { public static int findNearestNodeIndex(List<KMeansTreeNode> nodes,Clusterable target){ float minDistance = Float.MAX_VALUE; int index = -1; int i = 0; for ( KMeansTreeNode node : nodes ){ float distance = ClusterUtils.getEuclideanDistance(node,target); if ( distance < minDistance ){ index = i; minDistance = distance; } i++; } return index; } public static KMeansTreeNode findNearestNode(List<KMeansTreeNode> nodes, KMeansTreeNode targetNode){ int index = findNearestNodeIndex(nodes,targetNode); if ( index >= 0 ) return nodes.get(index); return null; } /** * @param node * @param totalNodeCount * @return */ public static List<Float> getCurrentWord(KMeansTreeNode node,int totalNodeCount){ List<Float> values = new LinkedList<Float>(); float weight = (float)Math.log((float)node.getNumSubItems()/(float)totalNodeCount); float val = weight * (float)node.getCurrentItemCount(); values.add(val); for ( KMeansTreeNode subNode : node.getSubNodes() ){ values.addAll(getCurrentWord(subNode,totalNodeCount)); } return values; } }