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

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

  • Upload
    devtype

  • View
    1.308

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

2 / 23

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

Пример

3 / 23

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

Пример

3 / 23

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

Пример

3 / 23

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

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

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

4 / 23

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

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

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

4 / 23

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

Алгоритм

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

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

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

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

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

5 / 23

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

Алгоритм

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

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

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

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

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

5 / 23

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

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

Функция 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

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

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

Функция 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

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

Пример

7 / 23

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

Пример

7 / 23

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

Пример

7 / 23

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

Пример

7 / 23

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

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

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

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

8 / 23

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

Пример

9 / 23

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

Пример

9 / 23

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

Замечание

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

10 / 23

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

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

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

11 / 23

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

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

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

11 / 23

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

Алгоритм

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

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

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

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

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

12 / 23

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

Алгоритм

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

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

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

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

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

12 / 23

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

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

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

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

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

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

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

13 / 23

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

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

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

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

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

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

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

13 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

Пример

14 / 23

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

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

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

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

15 / 23

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

Пример

16 / 23

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

Пример

16 / 23

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

Пример

16 / 23

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

Пример

16 / 23

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

Надёжный шаг

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

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

17 / 23

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

Надёжный шаг

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

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

17 / 23

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

Алгоритм

Функция MaxIndependentSet(T )

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

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

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

18 / 23

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

Алгоритм

Функция MaxIndependentSet(T )

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

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

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

18 / 23

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

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

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

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

19 / 23

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

Пример

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

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

Пример

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

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

Пример

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

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

Пример

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

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

Надёжный шаг

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

4

20

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

18

всего: 38 руб.

2

14

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

20/2

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

18

всего: 42 руб.

21 / 23

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

Алгоритм

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

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

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

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

22 / 23

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

Алгоритм

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

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

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

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

22 / 23

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

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

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

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

23 / 23