Изменения

Перейти к: навигация, поиск
Нет описания правки
return last;
};
 
==Алгоритм Грэма==
 
==Алгоритм Эндрюса==
 
==Алгоритм Merge hull==
 
==Алгоритм Quick hull==
 
==Алгоритм Чена==
'''Алгоритм Чена''' строит выпуклую оболочку конечного множества точек за <tex> O(n\log h) </tex> без вырожденных случаев, где <tex> h </tex> {{---}} количество точек в выпуклой оболочке. Основная идея заключается в том, чтобы разделить изначальное множество точек на группы по <tex> h </tex> элементов, построить выпуклые оболочки для каждой из групп, потом слить их в одну общую оболочку.
 
Алгоритм состоит из трех этапов
# Разбиение исходного множества точек на группы по <tex> h </tex> элементов в каждой.
# Построение выпуклых оболочек для групп.
# Объединение выпуклых оболочек.
 
Предположим, что <tex> h </tex> нам известно.
 
Исходное множество точек можно разбивать на группы любым способом. Для простоты будем выделять группы просто по порядку. Первые <tex> h </tex> элементов {{---}} первая группа, следующие <tex> h </tex> элементов {{---}} вторая группа и так далее.
 
Строить выпуклые оболочки для групп можно с помощью алгоритма Грэма за <tex> O(h \log h) </tex>. Всего <tex> m </tex> групп, получаем суммарную асимптотику <tex> O(m h \log h) = O(n \log h). </tex>
 
Для объединения оболочек будем использовать обход по Джарвису. Самая левая точка точно лежит на общей внутренней оболочке. Научимся находить следующую точку. предположим, что мы умеем находить опорную прямую за <tex> O(\log h). </tex> Всего оболочек <tex> m </tex>. Получается, что точку мы умеем находить за <tex> O(m \log h). </tex> Всего точек на выпуклой оболочке <tex> h </tex>. Получаем объеденение оболочек за <tex> O(m h \log h) = O(n \log h) </tex>.
 
===Выбор числа h ===
Заметим, что нам не обязательно знать точное значение <tex> h </tex>. Нас утроит любое значение <tex>\tilde h</tex>, такое что <tex>\log{\tilde h} = c \cdot \log h , c \ge 1 </tex>.
 
Будем использовать следующий метод:
 
Будем брать <tex> \tilde h = 2^{2^{t}} , t = 1, 2...</tex>, пока <tex> \tilde h \le h</tex>. На каждую итерацию потребуется <tex> O(n \log {2 ^{2^{t}}}) = O(n \cdot 2 ^ {t})</tex>.
 
<tex dpi = 140> 2^{2^{t}} \ge h \Rightarrow t \ge \log \log h </tex>.
 
Посчитаем, сколько нам понадобится времени на поиск <tex> \tilde h </tex>
 
<tex dpi = 140> \sum_{1}^{\log \log h} n \cdot 2 ^ t = n \cdot \sum_{1}^{\log \log h} 2 ^ t = </tex>
<tex dpi = 140> n \cdot 2 \cdot \frac{1 - 2^{\log \log h}}{1 - 2} = </tex>
<tex dpi = 140> n \cdot 2^{\log \log h + 1} - n \le n \cdot 2^{\log \log h + 1} = 2n \cdot \log h = O(n \cdot \log h)</tex>
Анонимный участник

Навигация