Задача...

From
Max Alekseyev (2:5015/60)
To
Andrew Plyako
Date
2002-10-24T12:19:20Z
Area
RU.ALGORITHMS
████ OS/2        Hi, Andrew !

Replying to a message of Andrew Plyako to Max Alekseyev:

 MA>> Полный перебор тут O(n^3).
 AP> С этим, согласен.

 MA>> Но даже в худшем случае можно управиться за O(n^2 log n).
 AP> Может быть и можно, но ты скажи, как :)

 MA>> Нет. Достаточно отсортировать точки по возрастанию угла поворота за
 MA>> время O(n*log n). Тогда при повороте до очередной точки, с одной
 MA>> стороны от прямой число точек уменьшится на единицу,
 AP> Ничего подобного. Это будет так, только если ты взял за базу "крайнюю"
 AP> точку, т.е. точку на границе выпуклой оболочки. Если же ты вращаешь
 AP> прямую вокруг "центральной" точки, то уменьшение может быть и более,
 AP> чем на 1. Пример:
 AP>    DE     B
 AP> G
 AP> F    A
 AP> H
 AP>           C

 AP> Если вращаем вокруг A, то при прямой AB соотношение 5:1, а при
 AP> следующей прямой (вращаем по часовой стрелке) AC, соотношение уже 3:3

Есть очевидный трюк: отобразим центрально-симметрично все точки в верхнюю полуплоскость и уже потом отсортируем по углу и т.д. 
На деле же ничего отображать не надо, достаточно сортировать не по значению угла, а по значению тангенса угла (как известно, тангенсы углов у центрально-симметричных равны).

 MA>> Когда про расположение точек ничего не известно, можно перебрать
 MA>> всевозможные "центры". Это решит задачу за время O(n^2*log n).

 AP> Вот этой фразы я, не понял. Как ты собираешься переходить от частного
 AP> случая (никакие 3 точки не лежат на одной прямой) к частному?

То, что написано выше, в любом случае находит лучшее решение для выбранного центра. Просто в случае, когда возможны "три точки на одной прямой", это решение может оказаться глобально неоптимальным.

Поэтому "в общем случае" перебираем все точки в качестве "центра", для каждой за время O(n*log n) находим решение как описано выше. Из этих решений выберем лучшее.

Regards,      °°
        Max    ~

--- FleetStreet 1.27.3.8
 * Origin:  (2:5015/60)