Я нарисую правильный алгоритм поли-времени.Несомненно, необходимо внести структурные улучшения данных, но я считаю, что, в частности, потребуется лучшее понимание этой проблемы для поиска очень больших наборов данных (или, возможно, специальной верхней границы для размеров блока, содержащегомногоугольник).
Основной цикл состоит из угадывания самой низкой точки p в самом большом выпуклом многоугольнике (разрыв связи в пользу самой левой точки) и затем вычисления самого большого выпуклого многоугольника, который может быть с p и точками q, такимичто (qy> py) ||(qy == py && qx> px).
Динамическая программа опирается на те же геометрические факты, что и Сканирование Грэма .Предположим без ограничения общности, что p = (0, 0), и отсортируем точки q по углу, который они делают против часовой стрелки относительно оси x (сравните две точки, учитывая знак их точечного произведения).Пусть точки в отсортированном порядке будут q 1 ,…, q n .Пусть q 0 = p.Для каждого 0 ≤ i 0 , подмножество q 1 ,…, q i- 1 , q i и q j .
Базовые случаи, когда i = 0, являются простыми, поскольку единственным «многоугольником» является нольСегмент q 0 q j .Индуктивно, чтобы вычислить запись (i, j), мы попробуем для всех 0 ≤ k ≤ i расширить полигон (k, i) с помощью (i, j).Когда мы можем это сделать?Во-первых, треугольник q 0 q i q j не должен содержать других точек.Другое условие заключается в том, что угол q k q i q j лучше не поворачивать направо (еще раз проверьте знак соответствующего точечного произведения).
В конце верните самый большой найденный многоугольник.Почему это работает?Нетрудно доказать, что выпуклые многоугольники имеют оптимальную подструктуру, требуемую динамической программой, и что программа рассматривает именно те многоугольники, которые удовлетворяют характеристике выпуклости Грэма.