Я предположил, что точки различны, иначе такой линии может даже не быть.
Если точки различны, то такая линия всегда существует и ее можно найти с помощью детерминированной Алгоритм времени 1004 * O (nlogn).
Скажем, точки: P1, P2, ..., P2n.Предположим, что они не все на одной линии.Если бы они были, то мы могли бы легко сформировать линию расщепления.
Сначала переведите точки так, чтобы все координаты (x и y) были положительными.
Теперь предположим, что мы волшебным образом имелиточка Q на оси y, такая, что никакая линия, образованная этими точками (то есть любая бесконечная линия Pi-Pj), не проходит через Q.
Теперь, поскольку Q не лежит в выпуклой оболочке точек, мы можемлегко увидеть, что мы можем упорядочить точки по вращающейся линии, проходящей через Q. Для некоторого угла поворота половина точек будет лежать на одной стороне, а другая половина будет лежать на другой этой вращающейся линии, или, другими словами,если мы рассмотрим точки, отсортированные по наклону линии Pi-Q, мы можем выбрать наклон между (медианной) и (медианной + 1) -й точками.Этот выбор может быть сделан за O (n) время любым линейным алгоритмом выбора времени без какой-либо необходимости фактически сортировать точки.
Теперь, чтобы выбрать точку Q.
Скажите, что Q было (0, б).
Предположим, что Q коллинеарен P1 (x1, y1) и P2 (x2, y2).
Тогда мы получим
(y1-b)/ x1 = (y2-b) / x2 (обратите внимание, что мы перевели точки так, чтобы xi> 0).
Решение для b дает
b = (x1y2 - y1x2) / (x1-x2)
(Обратите внимание, что если x1 = x2, то P1 и P2 не могут быть коллинеарными с точкой на оси Y).
Рассмотрим | b |.
|б |= | x1y2 - y1x2 |/ | x1 -x2 |
Теперь пусть xmax будет координатой x самой правой точки, а ymax координатой самой верхней.
Также пусть D будет наименьшим ненулевымРазница по координатам x между двумя точками (она существует, поскольку не все xis одинаковы, так как не все точки коллинеарны).
Тогда мы имеем, что | b |<= xmax * ymax / D. </p>
Таким образом, выберите нашу точку Q (0, b) так, чтобы | b |> b_0 = xmax * ymax / D
D можно найти за время O (nlogn).
Величина b_0 может быть довольно большой, и нам, возможно, придется иметь дело с проблемами точности.
Конечно, лучше выбрать Q случайно!С вероятностью 1 вы найдете нужную вам точку, таким образом делая ожидаемое время выполнения O (n).
Если бы мы могли найти способ выбрать Q за O (n), то время (найдя некоторый другой критерий)), тогда мы сможем запустить этот алгоритм за O (n) раз.