Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации / Лекция 2 (КАВГ).ppt
Скачиваний:
19
Добавлен:
01.05.2014
Размер:
105.98 Кб
Скачать

Оценки сложности задачи ВО

Задача сортировки:

Вход: X = (x1,x2, …, xn). Размер задачи - n. Задача ВО:

Вход: S = (p1, p2, …, pn), где pj = (xj, yj). Размер задачи - n.

Выход:

CH(S) - упорядоченный список вершин ВО

Преобразование CH(S) Sort(X)

1) Преобразование входа CH(S): Найти «нижнюю» крайнюю точку.

2)Сортировка по полярному углу – Sort

3)Преобразование выхода Sort в выход CH(S) –

обход Грэхема.

Отсюда – задача ВО м.б. решена за время O(n log n).

Это верхняя оценка.

Преобразование Sort(X) CH(S)

1) Преобразование входа X S: pj = (xj, xj2). Точки pj лежат на параболе.

2)Построение CH(S)

3)Найти точку p* с минимальным значением x (за O(n)).

Пройти по списку и получить

упорядоченный набор sort(X) (за O(n)).

Отсюда – задача ВО имеет нижнюю оценку сложности (n log n).

Алгоритм на основе сбалансированного разделения и слияния

Алгоритм на основе слияния выпуклых оболочек (1)

Func MergeCH(S): List;

begin

if S k then Построить CH(S) прямым методом

else

{1:} Найти S1 и S2 – разбиение S, такое, что S1 S2 ;

{2:} P1 := MergeCH(S1); P2 := MergeCH(S2);

{3:}Return CH_Union_ConvP(P1, P2)

fi

end { MergeCH }

Алгоритм на основе сбалансированного разделения и слияния

func CH_Union_ConvP(P1, P2): List;

{Выпуклая оболочка выпуклых многоугольников P1 и P2} begin

Найти точку p ] P1 [ ; {т.е. точку p – внутреннюю для P1 } if not (p ] P2 [ )

then

Найти клин upv {u, v P2} и освещенную цепь u v;

Удалить цепь ] u v [ из P2, т.е. P2 :=P2 \ { ] u v [ }

fi;

{ P1 и P2 упорядочены относительно точки p}

L := Слияние списков (L(P1), L(P2));

Применить обход Грэхема к L (результат: P);

Return P

end { CH_Union_ConvP }

Сложность алгоритма сбалансированного разделения и слияния

Рекуррентное соотношение:

T(n) 2T(n/2) + u(n), n>1. При n=1 T(n)=b. Пусть u(n) = O(n), т.е. u(n) a*n. Докажем, что T(n) = O(n log n),

т.е. T(n) С1 n log n + C2, где С1 = а+b, C2 = b. Действительно,

T(n) 2 (С1 (n/2) log (n/2) + C2) + a*n =

=С1n log n + 2C2 – С1n + a*n = С1n log n + b +(b-bn)

С1 n log n + C2

Общая идея метода «разделяй и властвуй»

“Divide et impera”

Три стадии:

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

2.Рекурсия – рекурсивно решается каждая из подзадач для составляющих.

3.Слияние – полученные результаты для составляющих объединяются (сливаются) в единый результат.

Быстрая сортировка – тоже пример подхода «разделяй и властвуй». Основные фазы: разделение и рекурсивные вызовы. Фаза слияния тривиальна и не требует дополнительных действий.

Сложность алгоритма сбалансированного разделения и слияния

Рекуррентное соотношение: T(n) = T( n/2 ) + T( n/2 ) + u(n);

T(1) = b. Разделение+Слияние: u(n) an; Тогда T(n) = O(n log2n).

Сложность алгоритма сбалансированного разделения и слияния

(1) Итеративное решение Пусть n = 2q (для простоты).

Тогда T(n) = 2T(n/2) + an; T(1) = b. T(n) = 2(2T(n/22) + an/2) + an= 22T(n/22) + 2an= = 22(2T(n/23) + an/22) + 2an= 23T(n/23) + 3an= =…= 2kT(n/2k) + kan;

При k=q: T(n/2k) =T(1) = b, 2k = n, q = log2n

T(n) = 2kT(n/2k) + kan = bn + an log2n Cn log2n ,

где С = a + b (например).

Т.о. T(n) = O(n log2n).

Сложность алгоритма сбалансированного разделения и слияния

(2) По индукции покажем, что решение T(n) = T( n/2 ) + T( n/2 ) + u(n); T(1) = b при u(n) = O(n) есть T(n) = O(n log2n).

Пусть u(n) аn и T(k) Ck log2k при k < n. T(n) C n/2 log2 n/2 + C n/2 log2 n/2 + аn

x x, x < x + 1

C n/2 log2(n/2)+ C n/2 log2 (n/2 +1) + аn