Понимание конкретной реализации линии свипирования ближайшей пары

0

Во-первых, я читал об алгоритме развертки, чтобы найти ближайшую пару точек в O (N lgN) времени в topcoder. Я в основном понял алгоритм, однако, когда я смотрю на реализацию, представленную здесь (скопированную и более читаемую ниже), я замечаю некоторые поразительные различия.

#define x first
#define y second
typedef pair<long long, long long> pll;
   ...
set <pll> boundingBox;
boundingBox.insert(points[0]); //Points have been already sorted by x-coordinate
for (int i = 1; i < numPoints; i++)
{
    while ((left < i) && (points[i].x - points[left].x > shortestDistSoFar))
    {
        boundingBox.erase(points[left]);
        left++;
    }

    for (auto it = boundingBox.lower_bound(pll(points[i].y - shortestDistSoFar, points[i].x - shortestDistSoFar)); it != boundingBox.end() && it->y <= points[i].y + shortestDistSoFar; it++)
    {
        if (dist(*it, points[i]) < shortestDistSoFar)
        {
            shortestDistSoFar = dist(*it, points[i]);
            best1 = *it;
            best2 = points[i];
        }
    }
    boundingBox.insert(points[i]);
}

Во- первых, в этом фрагменте реализации выше, станд :: набор, который имеет точки и представляет собой прямоугольник не отсортирован по у-координату (а по х-координаты), которое противоречит тому, что говорит почти каждый источник: The set is ordered by y coordinate. (Topcoder) The set is ordered by y coordinate. (Topcoder).

Затем, хотя набор не сортируется по y-координате, когда итератор используется для consider points in the active set... whose y coordinates are in the range yN − h to yN + h, его принимают за нижнюю bound of pll(points[i].y - shortestDistSoFar, points[i].x - shortestDistSoFar). Почему y придет первым? Я бы подумал, что правильным порядком будет pll(points[i].x, points[i].y - shortestDistSoFar) но изменение его на это нарушает алгоритм.

Может кто-то, пожалуйста, помогите решить эти, казалось бы, непоследовательные вещи?

  • 0
    Я не поняла Где это дано, что Y является первым элементом ?? `(typeof (box.begin ()) it = box.lower_bound (make_pair (pnts [i] .py-best, pnts [i] .px-best));` Пожалуйста, объясните
Теги:
set
algorithm
points

1 ответ

1
Лучший ответ

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

  • 0
    Ух ты. Кажется очевидным сейчас.
  • 0
    На самом деле, я нашел еще одну интересную вещь. Простое изменение #defines, чтобы сделать x second и y first без обновления сортировки точек (что делает compx в исходном коде), также, кажется, дает правильный ответ. То есть посещение точек в порядке y-координаты для линии развертки, по-видимому, также дает правильный ответ. Есть ли для этого веская причина? Возможно, что-то связано с тем, как расстояние от (x, y) до (a, b) равно расстоянию от (y, x) до (b, a)?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню