Я реализую простой жадный алгоритм слияния, который объединяет две точки, которые находятся ближе всего друг к другу, и усредняет их положение. После объединения двух точек с индексами i и j мне нужно заменить одну из них, скажем i, на среднее значение этих двух точек. Затем скопируйте последнюю точку в массиве поверх другой точки, скажем j, после чего я могу уменьшить размер массива на 1, при этом все оставшиеся точки будут в новом уменьшенном диапазоне. Мне нужно повторять вышеуказанный шаг, пока не останется только 3 репрезентативных точки, каждая из которых представляет собой группу объединенных точек. Я написал следующий код, но, думаю, он не может обновить массив (pts). Буду признателен, если кто-нибудь поможет мне разобраться в ошибке. Заранее спасибо. Это мой код: -

void merge_point(Point pts[], int &size) {

double a;
int x, y;
Point d;

while(size != 3) {
    double min = get_distance(pts[0],pts[1]);
    for (int i = 0; i < size; i++) {
            for (int j = i+1; j < size; j++) {
                get_distance(pts[i], pts[j]);
                if ((a = get_distance(pts[i],pts[j])) <= min) {
                    x = i;
                    y = j;
                }
                a = get_distance(pts[i],pts[j]);
            }
    }

        d = mean_point(pts[x],pts[y]);
        pts[x] = d;
        pts[y] = pts[size-1];
        size = size - 1;
   }
}

Когда я ввожу входной массив как: -

3 8 2

5,7 7,2 2,2

10,83 6,48 2,42

20,577 5,832 2,662

39,0963 5,2488 2,9282

74,283 4,72392 3,22102

141,138 4,25153 3,54312

268,162 3,82638 3,89743

509,507 3,44374 4,28718

968,063 3,09936 4,7159

Мои ожидаемые результаты должны быть: -

181,974 4,29686 3,57395

968,063 3,09936 4,7159

509,507 3,44374 4,28718

Но я получаю следующее: -

4,35 7,6 2,1

968,063 3,09936 4,7159

36,6506 5,8958 2,68145

c++
2
Pressing_Keys_24_7 18 Апр 2020 в 17:50

1 ответ

Лучший ответ

Думаю, я обнаружил проблему, вы не обновляете минимальное расстояние, как только найдете новое во время цикла, попробуйте следующее:

        cout << "distance between p[" << i << "] and " << "p[" << j << "]" << "is " << get_distance(pts[i], pts[j]) << '\n';

        if ((a = get_distance(pts[i], pts[j])) <= min)
        {
            cout << "current min distance is between point[" << i << "]" << " and point[" << j << "]" << '\n';
            min = a;
            x = i;
            y = j;
        }

Вам нужно добавить эту инструкцию:

min = a;

Чтобы обновить мин. В противном случае это будет работать только для некоторых крайних случаев.

2
SeventhSon84 18 Апр 2020 в 16:39