
- •Предисловие
- •Введение
- •Алгоритмы и их сложность
- •Примеры задач и алгоритмов
- •Задачи на графах: «Коммивояжер», «Кратчайшие пути», «Остовные деревья»
- •Приближенные алгоритмы: «Составление расписаний»
- •«Сортировка слиянием»
- •«Быстрая сортировка»
- •Формально об алгоритмах. Несложно о сложности
- •«RAM»: машины с произвольным доступом
- •Сложность в худшем случае
- •Сложность в среднем
- •Полиномиальные алгоритмы
- •Полиномиальность и эффективность
- •Аппроксимация с гарантированной точностью
- •Алгоритмы с оценками точности
- •Жадные алгоритмы для «Покрытия множеств»
- •Приближенные алгоритмы для «Вершинного покрытия»
- •Жадный алгоритм для «Рюкзака»
- •Алгоритм Кристофидеса
- •Аппроксимация с заданной точностью
- •«Рюкзак»: динамическое программирование
- •Полностью полиномиальная приближенная схема для «Рюкзака»
- •Вероятностный анализ детерминированных алгоритмов
- •Сложность и полиномиальность в среднем
- •Задача упаковки
- •Выполнимость КНФ
- •Точность алгоритма для почти всех входов
- •«Рюкзак»: полиномиальность в среднем
- •Вероятностные алгоритмы и их анализ
- •Вероятностная проверка тождеств
- •Максимальное по включению независимое множество в графе
- •Протокол византийского соглашения
- •Вероятностное округление
- •Максимальный разрез в графе
- •Методы дерандомизации
- •Метод условных вероятностей
- •Метод малых вероятностных пространств
- •Полиномиальная проверка простоты
- •Основы теории сложности вычислений
- •Сложность вычислений
- •Машины Тьюринга и вычислимость
- •Сводимость по Куку
- •Недетерминированные алгоритмы
- •Сводимость по Карпу
- •Вероятностные вычисления
- •Вероятностно проверяемые доказательства
- •Схемы и схемная сложность
- •Коммуникационная сложность
- •Диаграмма классов сложности
- •Приложения
- •Введение в Python
- •Глоссарий
- •Предметный указатель
- •Список алгоритмов

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
77 |
Решая это рекуррентное неравенство, получим:
Yk |
M |
[1 + (1 |
1 |
) + |
(1 |
|
1 |
) |
2 |
|
(1 |
1 |
) |
k 1 |
] = |
|
|
|
|
|
|
|
|||
|
|
|
|
|
+ : : : + |
|
|
|
|
|
|
|
|
|
|
||||||||||
k |
k |
k |
|
k |
[ |
|
k ) ] |
|
|
|
|
||||||||||||||
|
|
|
|
|
|
k |
[ |
|
( k |
|
) |
] |
|
|
|
( |
|
|
|
|
|||||
|
|
|
|
|
|
M |
1 |
1 |
1 |
k |
|
|
|
|
|
|
1 |
k |
|
|
|
|
|||
|
|
|
|
|
= |
|
|
|
|
|
k |
|
|
= M 1 |
|
1 |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
M [1 |
exp { |
k }] |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
= M(1 e 1): |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k |
|
|
Упражнение 2.1.4. Покажите, что оценка точности 1 e 1 для задачи о k-покрытии асимптотически достижима.
2.1.2Приближенные алгоритмы для «Вершинного покрытия»
Жадный и локальный алгоритмы для вершинного покрытия.
Рассмотрим один из вариантов задачи о покрытии на графах.

78 |
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
Определение 2.1.2. «Вершинное покрытие»³.
Для неориентированного графа G = (V; E) подмножество вершин V ′ V называется вершинным покрытием, если каждое ребро из E содержит хотя бы одну вершину из V ′.
Задача 12. «Минимальное вершинное покрытие» .
Дан неориентированный граф G = (V; E) (множество вершин V , множество ребер E). Найти вершинное покрытие минимальной мощности.
Первая интуитивная идея для решения задачи 12 «Min Vertex Covering» — использовать жадный алгоритм, выбирающий на каждом шаге вершину, имеющую на этом шаге наибольшее число непокрытых ребер (см. алгоритм 16).
Несмотря на «интуитивную разумность», оказалось, что этот алгоритм не обеспечивает даже константной точности.
Например, «плохим» для этого алгоритма будет граф, образованный следующим образом (см. рис. 2.1):
•Введем n вершин «первого уровня» v1; : : : ; vn.
•Разобьем вершины первого уровня на n2 непересекающихся пар, добавим n2 вершин второго уровня l12; : : : ; l2n/2 , и соединим каждую добавленную вершину со «своей» парой вершин первого уровня.
•Добавим n3 вершин третьего уровня l13; : : : ; l3n/3 , причем соединим каждую из них со всеми вершинами из одной из непересекающихся троек вершин первого уровня v1; : : : ; vn.
…
³В англоязычной литературе — Vertex Cover.
В англоязычной литературе — Min Vertex Covering.

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
79 |
Алгоритм 16 Жадный алгоритм для вершинного покрытия
def greedy_vertex_covering(G): C = set()
while G.number_of_edges() > 0: #цикл O(|E|) v_max = max_degree = -1
for n in G.nodes(): # цикл ≈ O(|V|) if G.degree(n) > max_degree:
v_max, max_degree = n, G.degree(n) C.add(v_max)
for v in G.neighbors(v_max):
#удаляем покрытые ребра
G.remove_edge(v_max, v)
return C
• Закрашенные вершины составляют вершинное покрытие .
• Пунктиром показаны покрытые (удаленные) ребра.

80 |
|
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

2.1. |
АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
81 |
|||
• |
Добавим последнюю ( |
n |
|
) вершину n 1–го уровня, соединенную с n |
1 вершиной первого |
n |
1 |
||||
|
уровня. |
|
|
|
Для всех вершин уровня k > 1 степень вершины будет ровно k, степень вершин первого уровня будет
не больше n 2 (степень n 2 будет у вершин первого уровня, которые оказались связанными со всеми |
|
вершинами верхних уровней). |
|
И хотя очевидным вершинным покрытием для такого графа являются вершины v1; |
: : : ; vn, алгоритм 16 |
начнет «есть» вершины начиная с верхних уровней, при этом степени вершин v1; |
: : : ; vn будут умень- |
шаться, так что в вершинное покрытие войдут только все вершины lkj , и не войдет ни одна из v1; : : : ; vn. Работа алгоритма на таком графе (для n = 6) показана на рис. 2.2.
Посчитаем fg число вершин, выбранных алгоритмом 16, и сравним его с f — оптимальным размером вершинного покрытия для этого графа:
n 1 |
|
n |
|
n 1 |
|
n |
1) |
n 1 1 |
(n 2) > |
||
fg = j=2 |
j |
> j=2 |
( j |
= n j=2 j |
|||||||
∑ |
|
|
|
|
∑ |
|
|
|
|
∑ |
|
∫ n 1
>n 2 xdx n = n(ln n ln 2 1) f (ln n ln 2 1):
Ихотя жадный алгоритм не смог обеспечить никакой констатной точности приближения для задачи 12 «Min Vertex Covering», оказалось, что есть еще более простой, не «жадный», а скорее «ленивый», локальный алгоритм 17, который является 2-приближенным. Алгоритм 17 просто добавляет для первого попавшегося непокрытого ребра обе его вершины, исключает покрытые этими вершинами ребра, после чего цикл повторяется.
Несмотря на «вопиющую неоптимальность» — добавление в вершинное покрытие для выбранного ребра обеих вершин, этот алгоритм может гарантировать константную точность, в частности, на рис. 2.3 видно, как он выигрывает у жадного алгоритма на «плохих» для жадного алгоритма графах.

82 |
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
Рис. 2.2: Неоптимальность жадного алгоритма для вершинного покрытия

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
83 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+— размер вершинного покрытия для жадного алгоритма 16.

84 |
Глава 2. |
АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
+ |
— размер вершинного покрытия для жадного алгоритма 16. |
|

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
85 |
Алгоритм 17 «Ленивый» алгоритм для задачи 12 «Min Vertex Covering» |
|
def lazy_vertex_covering(G): |
|
C = set() |
|
while G.number_of_edges() > 0: |
|
#первое попавшееся ребро |
|
(u, v) = G.edges()[0] |
|
C.add(u) |
|
C.add(v) |
|
for w in G.neighbors(u): |
|
G.remove_edge(u, w) |
|
for w in G.neighbors(v): |
|
G.remove_edge(v, w) |
|
return C |
|
• Закрашенные вершины составляют вершинное покрытие .
•Пунктиром показаны покрытые (удаленные) ребра.

86 |
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
Итак, докажем точность приближения.
Определение 2.1.3. Паросочетание — подмножество ребер графа, такое, что никакие два ребра из этого подмножества не инцидентны какой-либо одной вершине.
Теорема 3. Алгоритм 17 гарантирует точность 2 для задачи 12 «Min Vertex Covering».
Доказательство. Рассмотрим множество E «попавшихся алгоритму» ребер, вершины которых добавлялись в покрытие C. Это множество E является паросочетанием, т. е. все ребра из него попарно несмежны, а вершины этих ребер образуют вершинное покрытие. Любое вершинное покрытие, включая минимальное, должно содержать по крайней мере одну вершину для каждого ребра из E , поэтому OP T jE j, где OP T — число вершин в минимальном покрытии. Учитывая, что jE j = jCj/2, получаем:
jCj 2 OP T:
С другой стороны, на случайных графах алгоритм 17 несколько проигрывает «жадному» алгоритму 16 (см. рис. 2.4). Учитывая, что оба алгоритма — быстрые, на практических задачах можно запускать оба алгоритма, отбирая лучший ответ.
Упражнение 2.1.5. Найдите приближенный алгоритм с точностью 12 для нахождения максимального подмножества дуг, не образующих цикл, в ориентированном подграфе.
Упражнение 2.1.6. Найдите приближенный алгоритм с точностью 12 для нахождения максимального (по включению) паросочетания максимального объема.
Matching в англоязычной литературе.

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
87 |
Упражнение 2.1.7. Найдите приближенный алгоритм с точностью 12 для нахождения максимального (по включению) паросочетания минимального объема.
Упражнение 2.1.8. Студент предложил для задачи 2.1.2 «Vertex Covering» приближенный алгоритм с точностью 12 : найти в графе дерево (методом поиска в ширину), выкинуть из него листья, а оставшееся объявить вершинным покрытием. Прав ли он? Докажите или опровергните.
Упражнение 2.1.9. Студент предложил для задачи 2.1.2 «Vertex Covering» приближенный алгоритм с точностью 12 : найти в графе дерево (методом поиска в глубину), выкинуть из него листья, а оставшееся объявить вершинным покрытием. Прав ли он? Докажите или опровергните.
Рис. 2.5: Карта-памятка разделов 2.1.2и 2.1.1