мне нужно решить проблему алгоритма динамической выпуклой оболочки, то есть поддерживать выпуклую оболочку двумерных точек, где я могу добавлять и удалять точки.
Наивный подход явно O (N)
; всякий раз, когда одна из N
точек добавляется / удаляется, мы заново вычисляем выпуклую оболочку с нуля. Однако я не могу позволить себе линейное время, поэтому ищу сублинейный алгоритм. До сих пор я нашел кучу документов, в которых описывается какой-то сложный алгоритм с сумасшедшими временными рамками, реализация которого займет много времени. Даже самый старый эффективный алгоритм, созданный Овермарсом и Леувином, равный O (log ^ 2 N)
, кажется слишком сложным. (Как обычно, большинство алгоритмов, описанных в таких статьях, имеют массу зависимостей с точки зрения структур / алгоритмов из других, на которые есть ссылки, статей)
Я ищу что-то более простое, не обязательно новое, которое работает лучше, чем линейное по наихудший случай (например, O (sqrt N)
). Наконец, я не против, если время будет амортизировано. Есть идеи?
(Говоря просто, я в первую очередь имею в виду то, что не требует более нескольких сотен строк кода.)