В поиске ближайшей пары точек в O(nlgn) времени псевдокод для разделения отсортированного списка на два отсортированных списка (CLRS 3rd ed pg 1043), как говорят, выполняется в O(n) времени.
Однако это предполагает, что строка 4 работает в постоянное время, в которое мне трудно поверить (я бы предположил, что она работает в O(lgn) время, если бы она хранилась как двоичное дерево, давая общее время работы O(nlgn).
Y-отсортированный массив, YL и YR-два новых суб-массива. PL-подмножество Y в случайном порядке, и YL-то же подмножество, но в отсортированном порядке.
Где я ошибаюсь в своих рассуждениях?
Для простоты мы предполагаем, что список состоит из целых чисел, а не строк или целых чисел, которые могут значительно усложнить здесь.
Есть два расчета, чтобы рассмотреть здесь:
Для того, чтобы написать его с большей точностью будет означать, что вы учитываете время, необходимое для сравнения k (длина PL) и, следовательно, общее время этого псевдо-кода будет O(Nk). Но если предположения, что k является случайным и независимым от N, справедливы, то это действительно O (N)
Я не знаю, как это должно работать в книге, но, думая о том, как выглядит алгоритм, вы можете придумать следующую идею:
Y[i]
,X[i]
,YL[i]
,XL[i]
,YR[i]
иXR[i]
являются целыми числами, соответствующими индексуi
th-point (поэтому вам просто нужно сохранить некоторый глобальный массив, который, учитывая индекс, возвращает координатуx
ory
).PL[i]
является логическим,true
еслиi
-я точка находится в левой части,false
в противном случае.На каждом шаге рекурсии можно
PL[i]
вычислитьy
координаты (O(n)
время). Затем вы отделяете набор точек в два набора «левый» и «правый», используя алгоритм из книги , заменяя линиюif Y[i] in PL
наif PL[Y[i]]
(такой доступ естьO(1)
, поэтому в целом мы получаемO(n)
).Это имеет
O(n)
сложность во времени и используетO(n)
память.Таким образом, ближайшая парная задача решается таким образом
T(n) = O(n log n)
.