Вот код, который может вам помочь. Этот код просто для того, чтобы дать представление о подходе к проблеме, как задано в вопросе.
// declare a global array that will hold the 4 nearest atom_data...
struct oxygen_coordinates nearestNeighbours[4];
// This function adds the structure passed to it until it becomes full, after that it replaces the structure added from the first...
void addStructure(struct oxygen_coordinates possibleNeighbour) {
static int counter = 0;
int length = sizeof(nearestNeighbour)/sizeof(possibleNeighbour);
if(length < 3) {
nearestNeighbours[length] = possibleNeighbour;
}
else {
nearestNeighbours[counter%4] = possibleNeighbour;
counter++;
}
}
Данный атом - это atom_data атома, для которого вы хотите найти соседей, а данные атома - весь массив.
Теперь мы создаем новую переменную с плавающей точкой, которая хранит найденное минимальное расстояние, и инициализируем ее очень высоким значением.
После этого мы перебираем atom_data и, если мы находим кандидата с расстоянием, меньшим, чем значение min, которое мы сохранили, мы обновляем значение min и добавляем структуру в наш массив nearNeighbours с помощью метода add, который мы создали выше.
Как только мы пройдемся по всей структуре, у нас будет 4 ближайших atom_data внутри массива nearNeighbour.
knn(given_atom, atom_data, k) {
float minDistance = 10000; // Some large value...
for(int i=0; i<n; i++) {
int tempDistance = getDistance(given_atom, atom_data[i])
if(tempDistance<minDistance) {
addStructure(atom_data[i])
}
}
}
Сложность времени будет зависеть от длины atom_data, то есть n. Если массив хранится отсортированным образом, эта временная сложность может быть значительно уменьшена.