Жадные алгоритмы: введение

Post on 13-Jan-2017

1.308 views 0 download

Transcript of Жадные алгоритмы: введение

Жадные алгоритмы:введение

Александр Куликов

Онлайн-курс «Алгоритмы: теория и практика. Методы»http://stepic.org/217

Покрытие точек отрезками

Вход: множество n точек на прямой x1, . . . , xn ∈ R.Выход: минимальное количество отрезков единичной

длины, которыми можно покрыть все точки.

2 / 23

Пример

3 / 23

Пример

3 / 23

Пример

3 / 23

Надёжный шагСуществует оптимальное покрытие, в котором самая леваяточка покрыта левым концом отрезка.

Поэтому можно сразу добавить в решение отрезок, левыйконец которого совпадает с самой левой точкой.

4 / 23

Надёжный шагСуществует оптимальное покрытие, в котором самая леваяточка покрыта левым концом отрезка.

Поэтому можно сразу добавить в решение отрезок, левыйконец которого совпадает с самой левой точкой.

4 / 23

Алгоритм

Функция PointsCover(x1, . . . , xn)

S ← {x1, . . . , xn}пока S не пусто:

xm ← минимальная точка Sдобавить к решению отрезок [ℓ, r ] = [xm, xm + 1]выкинуть из S точки, покрытые отрезком [ℓ, r ]

вернуть построенное решение

Время работы: O(n2).

5 / 23

Алгоритм

Функция PointsCover(x1, . . . , xn)

S ← {x1, . . . , xn}пока S не пусто:

xm ← минимальная точка Sдобавить к решению отрезок [ℓ, r ] = [xm, xm + 1]выкинуть из S точки, покрытые отрезком [ℓ, r ]

вернуть построенное решение

Время работы: O(n2).

5 / 23

Улучшенный алгоритм

Функция PointsCover(x1, . . . , xn)

x1, . . . , xn ← Sort(x1, . . . , xn)i ← 1пока i ≤ n:

добавить к решению отрезок [ℓ, r ] = [xi , xi + 1]i ← i + 1пока i ≤ n и xi ≤ r:

i ← i + 1вернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

6 / 23

Улучшенный алгоритм

Функция PointsCover(x1, . . . , xn)

x1, . . . , xn ← Sort(x1, . . . , xn)i ← 1пока i ≤ n:

добавить к решению отрезок [ℓ, r ] = [xi , xi + 1]i ← i + 1пока i ≤ n и xi ≤ r:

i ← i + 1вернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

6 / 23

Пример

7 / 23

Пример

7 / 23

Пример

7 / 23

Пример

7 / 23

Задача о выборе заявок

Вход: множество n отрезков на прямой.Выход: максимальное количество попарно не

пересекающихся отрезков.

8 / 23

Пример

9 / 23

Пример

9 / 23

Замечание

Выбирая в первую очередь более короткие отрезки, можнополучить неоптимальное решение.

10 / 23

Надёжный шагСуществует оптимальное решение, содержащее отрезок,правый конец которого минимален.

Можно сразу добавить в решение отрезок, правый конецкоторого минимален.

11 / 23

Надёжный шагСуществует оптимальное решение, содержащее отрезок,правый конец которого минимален.

Можно сразу добавить в решение отрезок, правый конецкоторого минимален.

11 / 23

Алгоритм

Функция ActSel(ℓ1, r1, . . . , ℓn, rn)

S ← {[ℓ1, r1], . . . , [ℓn, rn]}пока S не пусто:

[ℓm, rm]← отрезок из S с мин. правым концомдобавить [ℓm, rm] к решениювыкинуть из S отрезки, пересекающиеся с [ℓm, rm]

вернуть построенное решение

Время работы: O(n2).

12 / 23

Алгоритм

Функция ActSel(ℓ1, r1, . . . , ℓn, rn)

S ← {[ℓ1, r1], . . . , [ℓn, rn]}пока S не пусто:

[ℓm, rm]← отрезок из S с мин. правым концомдобавить [ℓm, rm] к решениювыкинуть из S отрезки, пересекающиеся с [ℓm, rm]

вернуть построенное решение

Время работы: O(n2).

12 / 23

Улучшенный алгоритм

Функция ActSel(ℓ1, r1, . . . , ℓn, rn)

отсортировать n отрезков по правым концамдля всех отрезков в полученном порядке:

если текущий отрезок не пересекаетпоследний добавленный:взять его в решение

вернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

13 / 23

Улучшенный алгоритм

Функция ActSel(ℓ1, r1, . . . , ℓn, rn)

отсортировать n отрезков по правым концамдля всех отрезков в полученном порядке:

если текущий отрезок не пересекаетпоследний добавленный:взять его в решение

вернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

13 / 23

Пример

14 / 23

Пример

14 / 23

Пример

14 / 23

Пример

14 / 23

Пример

14 / 23

Пример

14 / 23

Пример

14 / 23

Планирование вечеринки в компании

Вход: дерево.Выход: независимое множество (множество не

соединённых друг с другом вершин)максимального размера.

15 / 23

Пример

16 / 23

Пример

16 / 23

Пример

16 / 23

Пример

16 / 23

Надёжный шаг

Существует оптимальное решение, содержащее каждыйлист дерева.

Можно взять в решение все листья.

17 / 23

Надёжный шаг

Существует оптимальное решение, содержащее каждыйлист дерева.

Можно взять в решение все листья.

17 / 23

Алгоритм

Функция MaxIndependentSet(T )

пока T не пусто:взять в решение все листьявыкинуть их и их родителей из T

вернуть построенное решение

Время работы: O(|T |).

18 / 23

Алгоритм

Функция MaxIndependentSet(T )

пока T не пусто:взять в решение все листьявыкинуть их и их родителей из T

вернуть построенное решение

Время работы: O(|T |).

18 / 23

Непрерывный рюкзак

Вход: веса w1, . . . ,wn и стоимости c1, . . . , cn данныхn предметов; вместимость рюкзака W .

Выход: максимальная стоимость частей предметовсуммарного веса не более W .

19 / 23

Пример

4

20 руб.

3

18 руб.

2

14 руб.

рюкзак

7

4

20

всего: 38 руб.

3

18

всего: 38 руб.

4

20

всего: 40 руб.

2

14

всего: 40 руб.

1

18/3

всего: 40 руб.

2

14

всего: 42 руб.

3

18

всего: 42 руб.

2

20/2

всего: 42 руб.

20 / 23

Пример

4

20 руб.

3

18 руб.

2

14 руб.

рюкзак

7

4

20

всего: 38 руб.

3

18

всего: 38 руб.

4

20

всего: 40 руб.

2

14

всего: 40 руб.

1

18/3

всего: 40 руб.

2

14

всего: 42 руб.

3

18

всего: 42 руб.

2

20/2

всего: 42 руб.

20 / 23

Пример

4

20 руб.

3

18 руб.

2

14 руб.

рюкзак

74

20

всего: 38 руб.

3

18

всего: 38 руб.

4

20

всего: 40 руб.

2

14

всего: 40 руб.

1

18/3

всего: 40 руб.

2

14

всего: 42 руб.

3

18

всего: 42 руб.

2

20/2

всего: 42 руб.

20 / 23

Пример

4

20 руб.

3

18 руб.

2

14 руб.

рюкзак

74

20

всего: 38 руб.

3

18

всего: 38 руб.

4

20

всего: 40 руб.

2

14

всего: 40 руб.

1

18/3

всего: 40 руб.

2

14

всего: 42 руб.

3

18

всего: 42 руб.

2

20/2

всего: 42 руб.

20 / 23

Надёжный шаг

Существует оптимальное решение, содержащеемаксимально возможную часть предмета, стоимостькоторого за килограмм максимальна.

4

20

всего: 38 руб.3

18

всего: 38 руб.

2

14

всего: 42 руб.2

20/2

всего: 42 руб.3

18

всего: 42 руб.

21 / 23

Алгоритм

Функция Knapsack(w1, c1, . . . ,wn, cn)

отсортировать предметы по убыванию c/wдля всех предметов в полученном порядке:

взять по максимуму текущего предметавернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

22 / 23

Алгоритм

Функция Knapsack(w1, c1, . . . ,wn, cn)

отсортировать предметы по убыванию c/wдля всех предметов в полученном порядке:

взять по максимуму текущего предметавернуть построенное решение

Время работы: T (Sort) + O(n) = O(n log n).

22 / 23

Основные идеи

Надёжный шаг. Существует оптимальное решение,согласованное с локальным жадным шагом.

Оптимальность подзадач. Задача, остающаяся послежадного шага, имеет тот же тип.

23 / 23