Опечатки в слайдах на видео: в псевдокоде алгоритма решения непрерывной задачи о рюкзаке предметы должны сортироваться по убыванию (а не возрастанию) удельной стоимости.
2. Покрытие точек отрезками
Вход: множество n точек на прямой x1, . . . , xn ∈ R.
Выход: минимальное количество отрезков единичной
длины, которыми можно покрыть все точки.
2 / 23
7. Надёжный шаг
Существует оптимальное покрытие, в котором самая левая
точка покрыта левым концом отрезка.
Поэтому можно сразу добавить в решение отрезок, левый
конец которого совпадает с самой левой точкой.
4 / 23
8. Алгоритм
Функция PointsCover(x1, . . . , xn)
S ← {x1, . . . , xn}
пока S не пусто:
xm ← минимальная точка S
добавить к решению отрезок [ℓ, r] = [xm, xm + 1]
выкинуть из S точки, покрытые отрезком [ℓ, r]
вернуть построенное решение
5 / 23
9. Алгоритм
Функция PointsCover(x1, . . . , xn)
S ← {x1, . . . , xn}
пока S не пусто:
xm ← минимальная точка S
добавить к решению отрезок [ℓ, r] = [xm, xm + 1]
выкинуть из S точки, покрытые отрезком [ℓ, r]
вернуть построенное решение
Время работы: O(n2
).
5 / 23
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
вернуть построенное решение
6 / 23
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
21. Надёжный шаг
Существует оптимальное решение, содержащее отрезок,
правый конец которого минимален.
Можно сразу добавить в решение отрезок, правый конец
которого минимален.
11 / 23
22. Алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
S ← {[ℓ1, r1], . . . , [ℓn, rn]}
пока S не пусто:
[ℓm, rm] ← отрезок из S с мин. правым концом
добавить [ℓm, rm] к решению
выкинуть из S отрезки, пересекающиеся с [ℓm, rm]
вернуть построенное решение
12 / 23
23. Алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
S ← {[ℓ1, r1], . . . , [ℓn, rn]}
пока S не пусто:
[ℓm, rm] ← отрезок из S с мин. правым концом
добавить [ℓm, rm] к решению
выкинуть из S отрезки, пересекающиеся с [ℓm, rm]
вернуть построенное решение
Время работы: O(n2
).
12 / 23
24. Улучшенный алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
отсортировать n отрезков по правым концам
для всех отрезков в полученном порядке:
если текущий отрезок не пересекает
последний добавленный:
взять его в решение
вернуть построенное решение
13 / 23
25. Улучшенный алгоритм
Функция ActSel(ℓ1, r1, . . . , ℓn, rn)
отсортировать n отрезков по правым концам
для всех отрезков в полученном порядке:
если текущий отрезок не пересекает
последний добавленный:
взять его в решение
вернуть построенное решение
Время работы: T(Sort) + O(n) = O(n log n).
13 / 23
33. Планирование вечеринки в компании
Вход: дерево.
Выход: независимое множество (множество не
соединённых друг с другом вершин)
максимального размера.
15 / 23
42. Непрерывный рюкзак
Вход: веса w1, . . . , wn и стоимости c1, . . . , cn данных
n предметов; вместимость рюкзака W .
Выход: максимальная стоимость частей предметов
суммарного веса не более W .
19 / 23
47. Надёжный шаг
Существует оптимальное решение, содержащее
максимально возможную часть предмета, стоимость
которого за килограмм максимальна.
4
20
всего: 38 руб.3
18
всего: 38 руб.
2
14
всего: 42 руб.2
20/2
всего: 42 руб.3
18
всего: 42 руб.
21 / 23
48. Алгоритм
Функция Knapsack(w1, c1, . . . , wn, cn)
отсортировать предметы по убыванию c/w
для всех предметов в полученном порядке:
взять по максимуму текущего предмета
вернуть построенное решение
22 / 23
49. Алгоритм
Функция Knapsack(w1, c1, . . . , wn, cn)
отсортировать предметы по убыванию c/w
для всех предметов в полученном порядке:
взять по максимуму текущего предмета
вернуть построенное решение
Время работы: T(Sort) + O(n) = O(n log n).
22 / 23
50. Основные идеи
Надёжный шаг. Существует оптимальное решение,
согласованное с локальным жадным шагом.
Оптимальность подзадач. Задача, остающаяся после
жадного шага, имеет тот же тип.
23 / 23