- // arrange increasingly distances array and update kNN indexes
- TMath::Sort(nPoints, dist, index, kFALSE);
- for(int ibrowse=0; ibrowse<nPoints; ibrowse++){
- // exit if the current distance calculated in this node is
- // larger than the largest distance stored in the kNN array
- if(dist[index[ibrowse]] >= fkNN_dist[k-1]) break;
- for(int iNN=0; iNN<k; iNN++){
- if(dist[index[ibrowse]] < fkNN_dist[iNN]){
- //insert neighbor. In principle this is only one call to STL vector. Maybe we can change to it ?!
- //printf("\t\tinsert data %d @ %d distance %f\n", indexPoints[index[ibrowse]], iNN, dist[index[ibrowse]]);
-
- memcpy(fkNN_tmp, &fkNN[iNN], (k-iNN-1)*sizeof(Index));
- fkNN[iNN] = indexPoints[index[ibrowse]];
- memcpy(&fkNN[iNN+1], fkNN_tmp, (k-iNN-1)*sizeof(Index));
-
- memcpy(fkNN_dist_tmp, &fkNN_dist[iNN], (k-iNN-1)*sizeof(Value));
- fkNN_dist[iNN] = dist[index[ibrowse]];
- memcpy(&fkNN_dist[iNN+1], fkNN_dist_tmp, (k-iNN-1)*sizeof(Value));
- break;
- }
+ for(int ibrowse=0; ibrowse<npoints; ibrowse++){
+ if(fDistBuffer[ibrowse] >= fkNNdist[k-1]) continue;
+ //insert neighbor
+ int iNN=0;
+ while(fDistBuffer[ibrowse] >= fkNNdist[iNN]) iNN++;
+ if(debug>=2) printf("\t\tinsert data %d @ %d distance %f\n", fIndBuffer[ibrowse], iNN, fDistBuffer[ibrowse]);
+
+ itmp = fkNN[iNN]; ftmp = fkNNdist[iNN];
+ fkNN[iNN] = fIndBuffer[ibrowse];
+ fkNNdist[iNN] = fDistBuffer[ibrowse];
+ for(int ireplace=iNN+1; ireplace<k; ireplace++){
+ jtmp = fkNN[ireplace]; gtmp = fkNNdist[ireplace];
+ fkNN[ireplace] = itmp; fkNNdist[ireplace] = ftmp;
+ itmp = jtmp; ftmp = gtmp;
+ if(ftmp == 9999.) break;