Учим треугольники в самолете


13

Я поставил перед своими учениками задачу нахождения треугольника, согласующегося с набором точек в R 2 , помеченных как ± 1 . (Треугольник Т является согласуется с меченым образцом , если Т содержит все положительные и ни один из негативных моментов, по предположению, образец допускает по меньшей мере , 1 соответствует треугольнику).mR2±1TT

Лучшее, что они (или я) могли бы сделать, - это алгоритм, работающий за время , где m - размер выборки. Кто-нибудь может сделать лучше?O(m6)m


Просто чтобы прояснить: вершины треугольника не обязательно должны быть точками коллекции, верно? И допустимо ли иметь отрицательные точки на границе?
ex0du5

(1) Я проголосовал, чтобы закрыть вопрос, потому что я неправильно понял проблему. Система не позволяет мне отменить свой голос, но я фактически отменяю его. (2) Я думаю, что есть алгоритм времени O (m log m), но у меня нет времени, чтобы проверить это прямо сейчас. Идея состоит в том, чтобы вычислить выпуклую оболочку из положительных примеров и обвести ее вокруг выпуклой оболочки, чтобы найти три линии, образующие желаемый треугольник.
Цуёси Ито

@ ex0du5 - действительно, вершины треугольника не обязательно должны состоять из точек выборки. Что касается пограничных вопросов, их здесь можно игнорировать, поскольку они несущественны. [Если граница считается частью треугольника, у вас не будет отрицательных точек на границе.]
Арье

@TsuyoshiIto: Я думал так же, но есть случаи, когда невозможно, чтобы края треугольника были коллинеарны краям выпуклой оболочки, но треугольник все еще существует. Треугольник, очевидно, все еще содержит выпуклую оболочку, но он не просто расширяет линии корпуса и находит треугольник. Вам могут понадобиться линии, которые вращаются вокруг некоторых вершин, чтобы избежать отрицательных точек. Вот почему я спросил о негативах на границе, чтобы алгоритм поиска, который выбирал линии от вершин корпуса до негативов, оставлял этот поиск дискретным.
ex0du5

@ ex0du5: Ну, я не предполагал, что ребра треугольника параллельны некоторым ребрам выпуклой оболочки положительных примеров.
Цуёси Ито

Ответы:


14

Как подсказывает @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)

пример $ C $ и $ F $

Отметьте края попеременно по часовой стрелке и против часовой стрелки. Edelsbrunner и Препарат дополнительно доказать , что если разделительный треугольник существует, то существует разделение треугольник, ребро которого лежит на одной прямых с кромками по часовой стрелке F . В O ( n ) дополнительное время мы можем найти (обязательно по часовой стрелке) ребро F, сначала пораженное лучом от каждого по часовой стрелке ребра e ; Назовите этот край "преемником" e . Следующие указатели разбивают ребра по часовой стрелке на циклы; если есть разделяющий треугольник, один из этих последовательных циклов имеет длину 3 (и ни один не имеет длину больше 4).FFO(n)Fee

Смотрите оригинальную статью для более подробной информации:


3

Мне кажется, что достаточно рассмотреть касательные линии из точек «-1» на выпуклой оболочке точек «+1» в качестве кандидатов на стороны (скажем, точки «+1» будут внутренними к ТTT ).

Жаль, я не могу публиковать изображения здесь. Но представьте себе: - это касательная к выпуклой оболочке, проходящая через некоторую точку «-1». А - точка касания. B - крайняя (см. Ниже) точка на t , а B C - касательная к точке от точки B ( CtABtBCBC - точка касания).

Итак, алгоритм следующий. Для каждой строки t касательных линий мы можем попытаться построить треугольник на ее основе:

  1. Вычислить точки пересечения t со всеми другими линиями;
  2. ABtAABCABBCAC
  3. t

O(m2)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.