Skip to content

Дергачёв Арсений. Технология OMP. Построение выпуклой оболочки – проход Грэхема. Вариант 22#261

Open
arssedot wants to merge 3 commits intolearning-process:masterfrom
arssedot:dergachev_a_graham_scan_omp
Open

Дергачёв Арсений. Технология OMP. Построение выпуклой оболочки – проход Грэхема. Вариант 22#261
arssedot wants to merge 3 commits intolearning-process:masterfrom
arssedot:dergachev_a_graham_scan_omp

Conversation

@arssedot
Copy link
Contributor

@arssedot arssedot commented Mar 6, 2026

Задача: Построение выпуклой оболочки – проход Грэхема

Вариант: 22

Технология: OMP (OpenMP)

Описание

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

Алгоритм работает следующим образом:

  • Выбирается опорная точка, то есть, точка с минимальной y-координатой (при равенстве - с минимальной x-координатой)
  • Все остальные точки сортируются по полярному углу относительно опорной точки
  • Используется стек для построения оболочки: для каждой точки проверяется, образует ли она левый поворот с последними двумя точками в стеке
  • Если поворот правый или коллинеарный, точка удаляется из стека до тех пор, пока не будет найден левый поворот
  • Итоговая выпуклая оболочка формируется из точек, оставшихся в стеке

В реализации OpenMP используется для параллелизации:

  • Генерация точек (#pragma omp parallel for): координаты точек на окружности вычисляются параллельно, каждый поток обрабатывает свою часть массива
  • Поиск опорной точки (#pragma omp parallel + #pragma omp for nowait + #pragma omp critical): массив разбивается между потоками, каждый поток находит локальный минимум в своём диапазоне, затем через критическую секцию результаты объединяются в глобальный минимум

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


Checklist

  • Статус CI: Все CI-задачи (сборка, тесты) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем <фамилия><первая_буква_имени><короткое_название_задачи>
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи (например, nesterov_a_vector_sum), а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и достоверными

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant