Жадные алгоритмы: введение
TRANSCRIPT
![Page 1: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/1.jpg)
Жадные алгоритмы:введение
Александр Куликов
Онлайн-курс «Алгоритмы: теория и практика. Методы»http://stepic.org/217
![Page 2: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/2.jpg)
Покрытие точек отрезками
Вход: множество n точек на прямой x1, . . . , xn ∈ R.Выход: минимальное количество отрезков единичной
длины, которыми можно покрыть все точки.
2 / 23
![Page 3: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/3.jpg)
Пример
3 / 23
![Page 4: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/4.jpg)
Пример
3 / 23
![Page 5: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/5.jpg)
Пример
3 / 23
![Page 6: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/6.jpg)
Надёжный шагСуществует оптимальное покрытие, в котором самая леваяточка покрыта левым концом отрезка.
Поэтому можно сразу добавить в решение отрезок, левыйконец которого совпадает с самой левой точкой.
4 / 23
![Page 7: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/7.jpg)
Надёжный шагСуществует оптимальное покрытие, в котором самая леваяточка покрыта левым концом отрезка.
Поэтому можно сразу добавить в решение отрезок, левыйконец которого совпадает с самой левой точкой.
4 / 23
![Page 8: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/8.jpg)
Алгоритм
Функция PointsCover(x1, . . . , xn)
S ← {x1, . . . , xn}пока S не пусто:
xm ← минимальная точка Sдобавить к решению отрезок [ℓ, r ] = [xm, xm + 1]выкинуть из S точки, покрытые отрезком [ℓ, r ]
вернуть построенное решение
Время работы: O(n2).
5 / 23
![Page 9: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/9.jpg)
Алгоритм
Функция PointsCover(x1, . . . , xn)
S ← {x1, . . . , xn}пока S не пусто:
xm ← минимальная точка Sдобавить к решению отрезок [ℓ, r ] = [xm, xm + 1]выкинуть из S точки, покрытые отрезком [ℓ, r ]
вернуть построенное решение
Время работы: O(n2).
5 / 23
![Page 10: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/10.jpg)
Улучшенный алгоритм
Функция 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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/11.jpg)
Улучшенный алгоритм
Функция 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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/12.jpg)
Пример
7 / 23
![Page 13: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/13.jpg)
Пример
7 / 23
![Page 14: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/14.jpg)
Пример
7 / 23
![Page 15: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/15.jpg)
Пример
7 / 23
![Page 16: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/16.jpg)
Задача о выборе заявок
Вход: множество n отрезков на прямой.Выход: максимальное количество попарно не
пересекающихся отрезков.
8 / 23
![Page 17: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/17.jpg)
Пример
9 / 23
![Page 18: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/18.jpg)
Пример
9 / 23
![Page 19: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/19.jpg)
Замечание
Выбирая в первую очередь более короткие отрезки, можнополучить неоптимальное решение.
10 / 23
![Page 20: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/20.jpg)
Надёжный шагСуществует оптимальное решение, содержащее отрезок,правый конец которого минимален.
Можно сразу добавить в решение отрезок, правый конецкоторого минимален.
11 / 23
![Page 21: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/21.jpg)
Надёжный шагСуществует оптимальное решение, содержащее отрезок,правый конец которого минимален.
Можно сразу добавить в решение отрезок, правый конецкоторого минимален.
11 / 23
![Page 22: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/22.jpg)
Алгоритм
Функция 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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/23.jpg)
Алгоритм
Функция 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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/24.jpg)
Улучшенный алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
отсортировать n отрезков по правым концамдля всех отрезков в полученном порядке:
если текущий отрезок не пересекаетпоследний добавленный:взять его в решение
вернуть построенное решение
Время работы: T (Sort) + O(n) = O(n log n).
13 / 23
![Page 25: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/25.jpg)
Улучшенный алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
отсортировать n отрезков по правым концамдля всех отрезков в полученном порядке:
если текущий отрезок не пересекаетпоследний добавленный:взять его в решение
вернуть построенное решение
Время работы: T (Sort) + O(n) = O(n log n).
13 / 23
![Page 26: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/26.jpg)
Пример
14 / 23
![Page 27: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/27.jpg)
Пример
14 / 23
![Page 28: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/28.jpg)
Пример
14 / 23
![Page 29: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/29.jpg)
Пример
14 / 23
![Page 30: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/30.jpg)
Пример
14 / 23
![Page 31: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/31.jpg)
Пример
14 / 23
![Page 32: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/32.jpg)
Пример
14 / 23
![Page 33: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/33.jpg)
Планирование вечеринки в компании
Вход: дерево.Выход: независимое множество (множество не
соединённых друг с другом вершин)максимального размера.
15 / 23
![Page 34: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/34.jpg)
Пример
16 / 23
![Page 35: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/35.jpg)
Пример
16 / 23
![Page 36: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/36.jpg)
Пример
16 / 23
![Page 37: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/37.jpg)
Пример
16 / 23
![Page 38: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/38.jpg)
Надёжный шаг
Существует оптимальное решение, содержащее каждыйлист дерева.
Можно взять в решение все листья.
17 / 23
![Page 39: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/39.jpg)
Надёжный шаг
Существует оптимальное решение, содержащее каждыйлист дерева.
Можно взять в решение все листья.
17 / 23
![Page 40: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/40.jpg)
Алгоритм
Функция MaxIndependentSet(T )
пока T не пусто:взять в решение все листьявыкинуть их и их родителей из T
вернуть построенное решение
Время работы: O(|T |).
18 / 23
![Page 41: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/41.jpg)
Алгоритм
Функция MaxIndependentSet(T )
пока T не пусто:взять в решение все листьявыкинуть их и их родителей из T
вернуть построенное решение
Время работы: O(|T |).
18 / 23
![Page 42: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/42.jpg)
Непрерывный рюкзак
Вход: веса w1, . . . ,wn и стоимости c1, . . . , cn данныхn предметов; вместимость рюкзака W .
Выход: максимальная стоимость частей предметовсуммарного веса не более W .
19 / 23
![Page 43: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/43.jpg)
Пример
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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/44.jpg)
Пример
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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/45.jpg)
Пример
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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/46.jpg)
Пример
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: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/47.jpg)
Надёжный шаг
Существует оптимальное решение, содержащеемаксимально возможную часть предмета, стоимостькоторого за килограмм максимальна.
4
20
всего: 38 руб.3
18
всего: 38 руб.
2
14
всего: 42 руб.2
20/2
всего: 42 руб.3
18
всего: 42 руб.
21 / 23
![Page 48: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/48.jpg)
Алгоритм
Функция Knapsack(w1, c1, . . . ,wn, cn)
отсортировать предметы по убыванию c/wдля всех предметов в полученном порядке:
взять по максимуму текущего предметавернуть построенное решение
Время работы: T (Sort) + O(n) = O(n log n).
22 / 23
![Page 49: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/49.jpg)
Алгоритм
Функция Knapsack(w1, c1, . . . ,wn, cn)
отсортировать предметы по убыванию c/wдля всех предметов в полученном порядке:
взять по максимуму текущего предметавернуть построенное решение
Время работы: T (Sort) + O(n) = O(n log n).
22 / 23
![Page 50: Жадные алгоритмы: введение](https://reader031.vdocuments.site/reader031/viewer/2022030304/58786efa1a28ab497b8b5a7d/html5/thumbnails/50.jpg)
Основные идеи
Надёжный шаг. Существует оптимальное решение,согласованное с локальным жадным шагом.
Оптимальность подзадач. Задача, остающаяся послежадного шага, имеет тот же тип.
23 / 23