Навчання трикутників у площині


13

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

Найкраще, що вони могли зробити (або я), це алгоритм, який працює в часі O(m6) , де m - розмір вибірки. Хтось може зробити краще?


Просто щоб було зрозуміло: вершини трикутника не повинні бути точками збору, правда? І допустимо мати негативні точки на кордоні?
ex0du5

(1) Я проголосував за закриття питання, оскільки я неправильно зрозумів проблему. Система не дозволяє мені скасувати свій голос, але я його фактично скасовую. (2) Я думаю, що існує алгоритм O (m log m) -time, але зараз не встигаю перевірити це. Ідея полягає у тому, щоб обчислити опуклий корпус позитивних прикладів і прокрутити цей опуклий корпус, щоб знайти три лінії, що утворюють потрібний трикутник.
Цуйосі Іто

@ ex0du5 - дійсно, вершини трикутника не повинні складатися із зразкових точок. Що стосується прикордонних питань, то тут їх можна ігнорувати, оскільки вони несуттєві. [Якщо межа вважається частиною трикутника, то у вас не буде негативних точок на межі.]
Ар'є

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

@ ex0du5: Ну, я не припускав, що краї трикутника паралельні деяким ребрам опуклого корпусу позитивних прикладів.
Цуйоші Іто

Відповіді:


14

Як підказує @TsuyoshiIto, існує алгоритм -time для цієї проблеми, завдяки Edelsbrunner та Preparata. Насправді їх алгоритм знаходить опуклий багатокутник з мінімально можливою кількістю ребер, що розділяє два набори точок. Вони також доводять нижню межу для більш загальної проблеми в алгебраїчній моделі рішень; однак не ясно, чи стосується ця нижня межа до випадку трикутника.Ω ( n log n )O(nlogn)Ω(nlogn)

Повний опис алгоритму тут занадто довгий, щоб опублікувати тут, але ось основна ідея. Нехай - опуклий корпус позитивних точок. Для кожного негативною точки , розгляне лінію через , які стосуються . Ці лінії розділяють площину на чотири клини, один з яких містить ; Нехай бути клин протилежної тій , яка містить . Нарешті, нехай ("заборонена область") є об'єднанням усіх клинів . Будь-трикутник поділу необхідно відокремити від . І іq q C C W ( q ) C F W ( q ) C F C F O ( n log n )CqqCCW(q)CFW(q)CFCFможе бути побудований за час.O(nlogn)

приклад $ C $ і $ F $

Позначте краї черзі за годинниковою стрілкою та проти годинникової стрілки. Едельсбруннер та Препарата також доводять, що якщо існує розділюючий трикутник, то існує розділюючий трикутник, ребра якого є колінеарними із стрілками за годинниковою стрілкою . Через додатковий час, ми можемо знайти (обов'язково за годинниковою стрілкою) край вперше потрапив променем, від кожного краю годинникової стрілки ; назвіть цей край "наступником" . Наступні вказівники розділяють краї за годинниковою стрілкою на цикли; якщо є розділюючий трикутник, один з цих наступних циклів має довжину 3 (а жоден не має довжини більше 4).F O ( n )FFO(n)e eFee

Докладнішу інформацію див. У оригінальному папері:


3

Мені здається, що достатньо розглядати дотичні лінії від точок '-1' на опуклому корпусі точок '+1' як кандидати для сторін (скажімо, що точки +1 'будуть внутрішніми до ).ТTT

Шкода, я не можу тут публікувати зображення. Але уявіть це: - дотична лінія до опуклого корпусу, яка проходить через деяку точку '-1'. - точка дотику. - крайня (див. Нижче) точка на , а - дотична лінія від точки ( - точка дотику).A B t B C B CtABtBCBC

Отже, алгоритм такий. Для кожного рядка дотичних ліній ми можемо спробувати побудувати на ньому трикутник:t

  1. Обчисліть точки перетину з усіма іншими прямими;t
  2. Знайдіть крайню (найдальшу від ) точку та відповідну пряму вправо (або ліворуч) від , таким чином, що псуедотрикутник (= , і частина опуклого корпусу між і ) не' t не містить «-1» балів (тобто не містить жодних точок).B t A A B C A B B C A CABtAABCABBCAC
  3. Зробіть те ж саме з лінією і подивіться, чи можемо ми «закрити» трикутник.t

Схоже, це був би час роботи . Може, це можна покращити за допомогою деяких структур даних?O(m2)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.