Я пытаюсь понять, как перейти от n log^2 n к n log n времени для парного парного алгоритма. Я получаю ниже часть (от http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html)Самый близкий парный алгоритм из (n log^2 n) в (n log n) time
- Divide множество на две равные по размеру части линией л, и рекурсивно вычислить минимальное расстояние в каждой части.
- Пусть d - минимальное из двух минимальных расстояний.
- Устранить точки, которые лежат дальше, чем d, кроме л
- Сортировать остальные точки в соответствии с их у-координаты
- Сканирование оставшихся точек в том порядке, у и вычисления расстояний каждой точки до пяти его соседей.
- Если какое-либо из этих расстояний меньше, чем d, обновите d.
Этап 4 - это сортировка, которая занимает время O (n log n), которое доминирует во всех остальных шагах, и это то, что необходимо свести к O (n), чтобы общий алгоритм достиг бы O (n log n). И это та часть, с которой мне трудно понять. Автор предлагает
Шаг 1: Разделите набор на ... и рекурсивно вычислите расстояние в каждой части, возвращая точки в каждом наборе в отсортированном порядке по y-координате. Шаг 4: Объедините два отсортированных списка в один отсортированный список в O (n) времени.
Вам по-прежнему приходится сортировать точки по y-координате на рекурсивном шаге, который принимает время O (n log n). Как мы можем избежать этого? Слияние - это O (n), но нам все равно придется сортировать.
Спасибо - это объяснение помогло и довольно кратким и ясным. –
@max_max_mir: Добро пожаловать! – ruakh