void balltree_nearest_n(priority_queue<pair<int, double>, vector<pair<int, double> >, sortNodes>& pq, struct ballnode* node, struct datapoint *t, int k, int D){ if (pq.size()==k){ if (getDistancePivot(t,node->pivot,D)>=pq.top().second) { return; } } else if(node->child1==NULL && node->child2 == NULL){ for (int i=0; i<node->data.size(); i++) { double dist =getDistance(t, node->data.at(i),D); if (pq.size()==k){ if(dist< pq.top().second){ pq.pop(); pq.emplace(make_pair(node->data.at(i)->idx,dist)); } } else pq.emplace(make_pair(node->data.at(i)->idx,dist)); } } else{ double dist_1 = getDistancePivot(t, node->child1->pivot,D); double dist_2 = getDistancePivot(t, node->child2->pivot,D); if(dist_1<dist_2){ balltree_nearest_n(pq,node->child1,t,k,D); balltree_nearest_n(pq,node->child2,t,k,D); } else{ balltree_nearest_n(pq,node->child2,t,k,D); balltree_nearest_n(pq,node->child1,t,k,D); } } }
inline void put(T item, Number priority) { elements.emplace(priority, item); }
REP(i, N) { pq.emplace(a[i]); }
REP(i, N) { pq.emplace(a[i], i); }