Участник:Aleksey Dumbay/QuickHull: различия между версиями
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
Алгоритм: QuickHull для двумерного случая | Алгоритм: QuickHull для двумерного случая | ||
− | Автор статьи: [[Участник:Aleksey_Dumbay|Думбай А.Д. группа 317]] | + | |
+ | Автор статьи: [[Участник: Aleksey_Dumbay |Думбай А.Д. группа 317]] | ||
= Свойства и структура алгоритма = | = Свойства и структура алгоритма = |
Текущая версия на 13:37, 30 октября 2017
Алгоритм: QuickHull для двумерного случая
Автор статьи: Думбай А.Д. группа 317
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Построение выпуклой оболочки множества точек - задача построения минимального по вложенности выпуклого множества, содержащего все точки из исходного множества. В случае конечного числа точек на плоскости выпуклая оболочка описывается некоторым подмножеством точек, которые принадлежат этой выпуклой оболочке. В этом случае выпуклая оболочка представляет собой выпуклый многоугольник с вершинами из этого подмножества точек.
Алгоритм QuickHull[1] - алгоритм построения выпуклой оболочки множества точек в среднем за [math]\Theta(N*\log{N})[/math] и за [math]O(N^2)[/math] в худшем случае, где [math]N[/math] - мощность множества точек. Алгоритм использует подход, аналогичный подходу QuickSort, разделяя исходное множество на некоторые подмножества, отсекая ненужные точки, после этого применяется рекурсивно к образовавшимся подмножествам, а потом объединяет их. В рамках этого алгоритма решаются две задачи - выделения подмножеств и объединения нескольких выпуклых оболочек вместе.
Есть несколько различных вариантов данного алгоритма, которые по-разному находят подмножества для рекурсивного обхода. Общая их идея заключается в выделении крайних точек и отсечении всех точек, что попали в образованный ими многоугольник. Остальные точки делятся на множества и обрабатываются рекурсивно. Так же существует вариант алгоритма, в котором рекурсивно находится наиболее удаленная от отрезка вершина, отсекается образованный треугольник, а к новым сторонам и разбившемуся множеству алгоритм применяется рекурсивно.[2]
На вход алгоритму подается множество точек на плоскости, на выходе - те точки, которые являются вершинами выпуклой оболочки.
1.2 Математическое описание алгоритма
Выпуклое множество [math]A[/math] для векторного пространства [math]\mathbb{V}[/math] над [math]\mathbb{R}[/math] - такое множество, что
[math] \forall \textbf{x}, \textbf{y} \in A, \forall \alpha \in [0,1]: \textbf{x} \cdot \alpha + \textbf{y} \cdot (1 - \alpha) \in A [/math].[3]
Выпуклая оболочка множества точек [math]\mathbb{X}[/math] - это такое выпуклое множество, которое содержит все точки из множества [math]\mathbb{X}[/math] и при этом является минимальным по вложению. В случае [math]\mathbb{X}[/math] из [math]\mathbb{R}^2[/math] выпуклая оболочка является многоугольником.
На вход алгоритму подается множество [math]\mathbb{X}[/math] из [math]\mathbb{R}^2[/math], которое описывает набор точек на плоскости, где каждая точка - вектор [math](x,y)[/math] где компоненты соответствуют координатам на плоскости в декартовой системе координат. [math]\mathbb{X} = \{a_1, a_2, \ldots, a_N\}[/math]. Алгоритм работает в среднем за [math]\Theta(N*\log{N})[/math] и за [math]O(N^2)[/math] в худшем случае.
Алгоритм строит упорядоченный набор из точек [math]x_{1}, x_{2}, \ldots, x_m [/math], которые образуют многоугольник [math]X_1X_2X_3\ldots X_m[/math], являющийся выпуклой оболочкой множества точек [math]\mathbb{X}[/math], где [math]x_i \in A[/math].
1.3 Вычислительное ядро алгоритма
1.4 Макроструктура алгоритма
1.5 Схема реализации последовательного алгоритма
1.6 Последовательная сложность алгоритма
1.7 Информационный граф
1.8 Ресурс параллелизма алгоритма
1.9 Входные и выходные данные алгоритма
1.10 Свойства алгоритма
2 Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Масштабируемость алгоритма и его реализации
2.4 Динамические характеристики и эффективность реализации алгоритма
2.5 Выводы для классов архитектур
2.6 Существующие реализации алгоритма
3 Литература
- ↑ Barber, C. Bradford; Dobkin, David P.; Huhdanpaa, Hannu (1 December 1996). "The quickhull algorithm for convex hulls"
- ↑ Пример реализации такого варианта
- ↑ Выпуклое множество