Объяснение времени выполнения - PullRequest
0 голосов
/ 24 февраля 2011

Может кто-нибудь объяснить мне, почему рекурсивная часть этого алгоритма имеет время выполнения

T (n) = {O (1), если n ≤ 3; {Tf (n / 2) + Tc (n / 2) + O (n), если n> 3.

-> где Tf (n / 2) представляет функцию этажа T (n / 2), а Tc (n / 2) представляет функцию потолка ????

Алгоритм называется Shamos и основные шаги:

  1. Если n ≤ 3, найдите ближайшие точки по грубой силе и остановитесь.
  2. Найдите вертикальную линию V, которая делит входной набор на два непересекающихся подмножества PL и PR размера как можно равнее. Указывает налево или на линию принадлежат PL и точки справа или на линии принадлежат PR. Нет смысла принадлежит обоим с множества не пересекаются.
  3. Рекурсивно найти расстояние δL ближайшей пары точек в PL и расстояние δR ближайшей пара в PR.
  4. Пусть δ = min (δL, δR). Расстояние пары ближайших точек во входном множестве P равно точки, найденные на рекурсивном шаге (то есть, δ) или состоящие из расстояния между точкой в ​​PL и точка в PR.

    (a) Единственные баллы-кандидаты один от PL и один от PR должны быть в вертикальной полосе, состоящей из линии на расстоянии δ слева от линии V и линии на расстоянии δ справа от V

    (b) Пусть YV - массив точек в полосе, отсортированный по неубывающей координате y (то есть, если i ≤ j, то YV [i] ≤ YV [j]).

    (c) Начиная с первой точки в YV и проходя через все, кроме последней, проверьте расстояние этой точки с последующими 7 точками (или теми, которые остались, если их не так много, как 7). Если пара находится с расстоянием, строго меньшим δ, затем назначьте это расстояние δ.

  5. Возврат δ. Заранее спасибо.

1 Ответ

2 голосов
/ 24 февраля 2011

T(c(n/2)) и T(f(n/2)) описывают, сколько времени требуется для рекурсивного вызова алгоритма в левой и правой группах соответственно, поскольку половина точек была размещена в каждой группе.

O(n) происходит из хитрой части алгоритма: после рекурсивных вызовов мы нашли δ, а именно расстояние между ближайшей парой точек либо в левой группе, либо в правой группе. Теперь мы хотим найти пары, состоящие из одной точки из левой группы и одной точки из правой группы. Конечно, мало смысла смотреть на точки, которые находятся дальше, чем δ от средней линии. Тем не менее, все еще может быть, что все точки находятся в пределах δ от средней линии, поэтому, похоже, мы рискуем сравнить n^2 пар точек. Важное наблюдение сейчас заключается в том, что именно потому, что мы знаем, что в каждой группе ни одна пара точек не ближе, чем δ, мы знаем, что существует небольшой постоянный предел для худшего случая, сколько точек из правой группы нам нужно посмотреть для каждой пары в левой группе. Поэтому, если мы можем отсортировать наши точки только по их y-координатам, мы можем найти ближайшую пару за линейное время. Этот отсортированный список можно получить за линейное время из-за способа передачи списка между рекурсивными вызовами, но детали меня избегают (не стесняйтесь заполнять, любой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...