Линейные алгоритмы сортировки вершин в контурах многоугольников - PullRequest
1 голос
/ 12 мая 2010

Я выяснил алгоритм, который позволяет мне превращать мои замкнутые многоугольники в трапеции за линейное время, если у меня есть индексы вершин, отсортированные от самой низкой координаты до самой высокой.

Я получаю простые многоугольники как контуры. У них есть определенный порядок, который можно использовать большую часть времени.

Итак, учитывая эти условия, существует ли алгоритм сортировки в почти линейном времени?

Ответы [ 4 ]

1 голос
/ 12 мая 2010

Я думаю, что вы хотите получить ответ "нет", но я также думаю, что вы, возможно, захотите рассмотреть свой вопрос более тщательно.

Проблема в том, что вы используете непрерывные координаты, поэтому в принципе вы не можете использовать линейную сортировку. (На практике вы можете использовать, скажем, сортировку по основанию для обработки координаты фиксированного размера, но на практике это может быть на самом деле медленнее, чем стандартная сортировка O (N log N), из-за накладных расходов ...)

Теоретическое правило: всякий раз, когда у вас есть ситуация, когда вы можете сравнивать только свои значения, общая сортировка не может быть быстрее, чем O (N log N).

Вы упомянули неуказанное свойство, которое "могло бы эксплуатироваться большую часть времени". Проблема в том, что запись O () является асимптотическим, наихудшим, теоретическим свойством, поэтому «большую часть времени» не будет иметь значения. Определенное свойство ввода часто можно использовать таким образом, но:

  • ускорение O () очень чувствительно к тому, что именно ваша собственность
  • алгоритм с лучшей O () может быть намного медленнее для вашего практического применения
  • наиболее эффективный метод практического использования вашего ввода часто очень отличается от метода с лучшими асимптотическими свойствами

К сожалению, при настройке вашего алгоритма для использования ваших входных данных легко пропустить неясный сценарий наихудшего случая, который неожиданно убьет вашу производительность, еще долго после того, как вы ее выпустили. Самая важная вещь в O () вашего алгоритма - не дать ему сильно взорваться.

Обратите внимание, что для этой цели O (N log N) равняется почти линейному, и использование стандартной библиотеки библиотек с хорошим поведением вполне может быть правильным выбором.

0 голосов
/ 12 мая 2010

Я не уверен, что вы подразумеваете под "определенным порядком" и "большую часть времени". Я боюсь, что для простых (то есть невыпуклых) общих многоугольников решение может не найти решения, поскольку точки могут быть в любом порядке относительно их координат (у вас могут быть очень простые "простые" многоугольники ...)

Если вы, конечно, имеете дело с выпуклыми многоугольниками, линейная сортировка по времени относительно координаты y будет простой: просто найдите самую низкую точку и "поднимитесь" слева и справа параллельно ...

В любом случае, если у вас действительно большие полигоны, хорошо реализованный алгоритм O (n log n) может быть таким же быстрым или даже более быстрым, чем какой-либо алгоритм с линейным временем (например, если постоянный коэффициент линейного алгоритм больше чем log n ...)

0 голосов
/ 12 мая 2010

Ваш вопрос немного расплывчат, но предполагается следующее:

  1. Полигоны в 2D
  2. Вы хотите отсортировать вершины вдоль определенной оси (x или y)
  3. Полигоны определены как связанные контуры

Вы можете сделать следующее:

  1. Прогулка по вершинам
  2. Для первой вершины добавить ее в диапазон
  3. Для каждой другой вершины, если вершина «выше» предыдущей, добавьте ее к текущему диапазону, в противном случае создайте новый диапазон с вершиной в нем.
  4. Теперь у нас есть список отсортированных диапазонов, объедините диапазоны друг с другом: http://en.wikipedia.org/wiki/Merge_algorithm
0 голосов
/ 12 мая 2010

Алгоритмы сортировки, работающие за линейное время, - это сортировка по счетам, сортировка по осям и сортировка по сегментам.

Вики также полезна: Алгоритмы сортировки

...