Жадные алгоритмы: введение
TRANSCRIPT
Жадные алгоритмы:введение
Александр Куликов
Онлайн-курс «Алгоритмы: теория и практика. Методы»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