Как подсказывает @TsuyoshiIto, для этой задачи существует алгоритм времени , благодаря Edelsbrunner и Preparata. Фактически, их алгоритм находит выпуклый многоугольник с минимально возможным числом ребер, которое разделяет два набора точек. Они также доказывают Ω ( n log nO(nlogn)нижнюю оценку ) для более общей задачи в модели дерева алгебраических решений; однако, не ясно, относится ли эта нижняя граница к случаю треугольника.Ω(nlogn)
Полное описание алгоритма слишком длинное, чтобы публиковать здесь, но вот основная идея. Пусть - выпуклая оболочка положительных точек. Для каждого отрицательной точки д , рассмотрит линию через д , которые касаются C . Эти линии разбивают плоскость на четыре клина, один из которых содержит C ; Пусть Ш ( д ) быть клин противоположной той , которая содержит C . Наконец, пусть F («запрещенная область») будет объединением всех клиньев W ( q ) . Любой разделяющий треугольник должен отделять C отCqqCCW(q)CFW(q)CF, И и F могут быть построены за O ( n log n ) времени.CFO(nlogn)
Отметьте края попеременно по часовой стрелке и против часовой стрелки. Edelsbrunner и Препарат дополнительно доказать , что если разделительный треугольник существует, то существует разделение треугольник, ребро которого лежит на одной прямых с кромками по часовой стрелке F . В O ( n ) дополнительное время мы можем найти (обязательно по часовой стрелке) ребро F, сначала пораженное лучом от каждого по часовой стрелке ребра e ; Назовите этот край "преемником" e . Следующие указатели разбивают ребра по часовой стрелке на циклы; если есть разделяющий треугольник, один из этих последовательных циклов имеет длину 3 (и ни один не имеет длину больше 4).FFO(n)Fee
Смотрите оригинальную статью для более подробной информации: