Алгоритмы построения выпуклых оболочек множества точек на плоскости — различия между версиями
(Новая страница: «{{В разработке}}») |
|||
| Строка 1: | Строка 1: | ||
{{В разработке}} | {{В разработке}} | ||
| + | |||
| + | =Выпуклая оболочка множества точек= | ||
| + | |||
| + | {{Определение | ||
| + | |definition=Выпуклой оболочкой множества точек называется пересечение всех выпуклых множеств, содержащих все заданные точки.}} | ||
| + | |||
| + | Еще одно определение: | ||
| + | {{Определение | ||
| + | |definition=Выпуклой оболочкой множества точек называется линейная комбинация минимального набора точек, дающая все остальные точки.}} | ||
| + | |||
| + | Будем рассматривать множество точек на плоскости и способы построения их выпуклых оболочек. | ||
| + | |||
| + | Некоторые свойства выпуклых оболочек: | ||
| + | # Экстремальные всегда принадлежат выпуклой оболочке. | ||
| + | # Для равномерно распределенных в прямоугольнике точек, выпуклая оболочка будет состоять из логарифма точек. | ||
| + | # Если в изначальном массиве точка на 0-й позиции будет самой левой, то после построения выпуклой оболочки in-place она останется там же. | ||
| + | |||
| + | ==Алгоритм Джарвиса== | ||
| + | '''Алгоритм Джарвиса''' определяет последовательность точек, образующую выпуклую оболочку множества точек на плоскости. Так же известен как алгоритм "заворачивания подарка". | ||
| + | |||
| + | Время работы алгоритма {{---}} <tex> O(h \cdot n) </tex>, где <tex> h </tex> {{---}} количество точек в выпуклой оболочке. В случае <tex> h = n </tex> получаем <tex> O(n ^ 2) </tex>. | ||
| + | |||
| + | Алгоритм в силу своей простоты легко реализуется in-place. | ||
| + | |||
| + | ===Псевдокод=== | ||
| + | |||
| + | int jarvis(std::vector<dot> &dots) | ||
| + | { | ||
| + | int last = 0; | ||
| + | dots.push_back(dots[0]); | ||
| + | int size = dots.size(); | ||
| + | do | ||
| + | { | ||
| + | for(int i = last + 2; i < size; i++) | ||
| + | { | ||
| + | std::swap(dots[last + 1], max_element(dots[last + 1], dots[i])); | ||
| + | } | ||
| + | } | ||
| + | while(dots[last] != dots[0]); | ||
| + | |||
| + | std::swap(dots[last], dots[size - 1]); | ||
| + | dots.pop_back(); | ||
| + | |||
| + | return last; | ||
| + | }; | ||
Версия 15:46, 2 мая 2012
Эта статья находится в разработке!
Выпуклая оболочка множества точек
| Определение: |
| Выпуклой оболочкой множества точек называется пересечение всех выпуклых множеств, содержащих все заданные точки. |
Еще одно определение:
| Определение: |
| Выпуклой оболочкой множества точек называется линейная комбинация минимального набора точек, дающая все остальные точки. |
Будем рассматривать множество точек на плоскости и способы построения их выпуклых оболочек.
Некоторые свойства выпуклых оболочек:
- Экстремальные всегда принадлежат выпуклой оболочке.
- Для равномерно распределенных в прямоугольнике точек, выпуклая оболочка будет состоять из логарифма точек.
- Если в изначальном массиве точка на 0-й позиции будет самой левой, то после построения выпуклой оболочки in-place она останется там же.
Алгоритм Джарвиса
Алгоритм Джарвиса определяет последовательность точек, образующую выпуклую оболочку множества точек на плоскости. Так же известен как алгоритм "заворачивания подарка".
Время работы алгоритма — , где — количество точек в выпуклой оболочке. В случае получаем .
Алгоритм в силу своей простоты легко реализуется in-place.
Псевдокод
int jarvis(std::vector<dot> &dots)
{
int last = 0;
dots.push_back(dots[0]);
int size = dots.size();
do
{
for(int i = last + 2; i < size; i++)
{
std::swap(dots[last + 1], max_element(dots[last + 1], dots[i]));
}
}
while(dots[last] != dots[0]);
std::swap(dots[last], dots[size - 1]);
dots.pop_back();
return last;
};