我正在实现一个Flame聚类算法,作为一种学习更多关于图形和图形遍历的方法,其中一个步骤是构建K-最近邻图,我想知道最快的方法是什么通过一个节点列表并连接每个节点只是说,它最接近五个邻居。我的想法是,我将从一个节点开始,遍历其他节点的列表并保留最接近数组的那些节点,确保丢弃通过顶部n的所有节点。现在,我可以通过排序列表并保留前n个条目来实现这一点,但我宁愿在内存中保留更少的内容,所以我想知道是否有一种方法可以获得最终数组并将该数组更新为我迭代,或者是否有更有效的方法来生成ak最近邻图。
此外,请注意,这不是K-Nearest Neighbour Implementation in Java的副本。 KNNG与KNN不同。
答案 0 :(得分:1)
放置前n个节点,按列表排序。然后迭代其余节点,如果它适合当前列表(即是前n个节点),则将其放在列表中的相应位置并丢弃最后一个前n个节点。如果它不适合前n个列表,则丢弃它。
for each neighborNode
for(int i = 0; i < topNList.size(); i++){
if((dist = distanceMetric(neighborNode,currentNode)) > topNList.get(i).distance){
topNList.remove(topNList.size()-1)
neighborNode.setDistance(dist);
topNList.add(i, neighborNode);
}
答案 1 :(得分:1)
我认为最有效的方法是使用绑定优先级队列,比如 https://github.com/tdebatty/java-graphs#bounded-priority-queue