SlideShare a Scribd company logo
с/к “Эффективные алгоритмы”
                  Лекция 17: Жадные алгоритмы

                                     А. Куликов

                             Computer Science клуб при ПОМИ
                           http://logic.pdmi.ras.ru/∼infclub/




А. Куликов (CS клуб при ПОМИ)      17. Жадные алгоритмы         1 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   2 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   2 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   2 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   2 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   2 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   3 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   4 / 39
Общая идея



Общая идея




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   5 / 39
Общая идея



Общая идея
      На каждом шаге жадный алгоритм делает локально оптимальный
      выбор.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы         5 / 39
Общая идея



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




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            5 / 39
Общая идея



Общая идея
      На каждом шаге жадный алгоритм делает локально оптимальный
      выбор.
      Решение, найденное таким образом, не всегда оказывается
      оптимальным, но в ряде случаев все-таки оказывается.
      Общеизвестный пример — алгоритм для построения
      минимального покрывающего дерева: на каждом шаге берется
      самое легкое из возможных ребер.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             5 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   6 / 39
Задача о выборе заявок

Определение




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   7 / 39
Задача о выборе заявок

Определение
      Даны n пар чисел (si , fi ), где si < fi обозначает время начала
      занятия, а fi — конец.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                     7 / 39
Задача о выборе заявок

Определение
      Даны n пар чисел (si , fi ), где si < fi обозначает время начала
      занятия, а fi — конец.
      Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы
      [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                          7 / 39
Задача о выборе заявок

Определение
      Даны n пар чисел (si , fi ), где si < fi обозначает время начала
      занятия, а fi — конец.
      Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы
      [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si .
      Задача о выборе заявок (activity-selection problem) заключается в
      выборе максимального количества совместных друг с другом
      заявок.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                          7 / 39
Задача о выборе заявок

Определение
      Даны n пар чисел (si , fi ), где si < fi обозначает время начала
      занятия, а fi — конец.
      Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы
      [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si .
      Задача о выборе заявок (activity-selection problem) заключается в
      выборе максимального количества совместных друг с другом
      заявок.

Замечание
Будем считать, что заявки отсортированы в порядке возрастания
времени окончания: f1 ≤ f2 ≤ · · · ≤ fn .



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                          7 / 39
Алгоритм



Greedy-Activity-Selector(s, f )
1    n ← length[s]
2    A ← {1}
3    j ←1
4    for i ← 2 to n
5          do if si ≥ fj
6                then A ← A ∪ {i}
7                      j ←i
8    return A




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   8 / 39
Анализ алгоритма

Анализ алгоритма




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   9 / 39
Анализ алгоритма

Анализ алгоритма
      Время работы есть Θ(n) (при условии, что заявки
      отсортированы!).




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы    9 / 39
Анализ алгоритма

Анализ алгоритма
      Время работы есть Θ(n) (при условии, что заявки
      отсортированы!).
      Существует оптимальное решение, содержащее заявку 1: если в
      некотором оптимальном множестве заявка 1 не содержится, то
      первую заявку (то есть заявку с самым ранним временем
      окончания) этого множества можно заменить на заявку 1. При
      такой операции совместность не нарушится, а количество заявок
      останется прежним.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             9 / 39
Анализ алгоритма

Анализ алгоритма
      Время работы есть Θ(n) (при условии, что заявки
      отсортированы!).
      Существует оптимальное решение, содержащее заявку 1: если в
      некотором оптимальном множестве заявка 1 не содержится, то
      первую заявку (то есть заявку с самым ранним временем
      окончания) этого множества можно заменить на заявку 1. При
      такой операции совместность не нарушится, а количество заявок
      останется прежним.
      Итак, мы ищем решение, содержащее заявку 1. Значит, можно
      выкинуть все заявки, несовмеcтные с ней.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              9 / 39
Анализ алгоритма

Анализ алгоритма
      Время работы есть Θ(n) (при условии, что заявки
      отсортированы!).
      Существует оптимальное решение, содержащее заявку 1: если в
      некотором оптимальном множестве заявка 1 не содержится, то
      первую заявку (то есть заявку с самым ранним временем
      окончания) этого множества можно заменить на заявку 1. При
      такой операции совместность не нарушится, а количество заявок
      останется прежним.
      Итак, мы ищем решение, содержащее заявку 1. Значит, можно
      выкинуть все заявки, несовмеcтные с ней.
      Получаем подзадачу с меньшим количеством заявок.



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              9 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   10 / 39
Когда применимы жадные алгоритмы?



Две отличительные особенности жадных алгоритмов




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   11 / 39
Когда применимы жадные алгоритмы?



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




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              11 / 39
Когда применимы жадные алгоритмы?



Две отличительные особенности жадных алгоритмов
   1   Принцип жадного выбора: последовательность локально
       оптимальных (жадных) выборов дает глобально оптимальное
       решение. Для установления этого свойства, как правило, нужно
       показать, что жадный выбор согласован с некоторым
       оптимальным решением и что после выбора получается
       аналогичная подзадача.
   2   Свойство оптимальности для подзадач: оптимальное решение для
       задачи содержит оптимальные решения для подзадач.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              11 / 39
Жадный алгоритм или динамическое
программирование?
Определение
В непрерывной задаче о рюкзаке (fractional knapsack problem), в
отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части
предметов.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          12 / 39
Жадный алгоритм или динамическое
программирование?
Определение
В непрерывной задаче о рюкзаке (fractional knapsack problem), в
отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части
предметов.

Замечания




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          12 / 39
Жадный алгоритм или динамическое
программирование?
Определение
В непрерывной задаче о рюкзаке (fractional knapsack problem), в
отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части
предметов.

Замечания
      Нетрудно видеть, что жадный алгоритм находит оптимальное
      решение для непрерывной задачи о рюкзаке: на каждом шаге
      добавляем максимальное количество предмета максимальной
      удельной стоимости (стоимость/объём).




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             12 / 39
Жадный алгоритм или динамическое
программирование?
Определение
В непрерывной задаче о рюкзаке (fractional knapsack problem), в
отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части
предметов.

Замечания
      Нетрудно видеть, что жадный алгоритм находит оптимальное
      решение для непрерывной задачи о рюкзаке: на каждом шаге
      добавляем максимальное количество предмета максимальной
      удельной стоимости (стоимость/объём).
      Нетрудно также убедиться в том, что аналогичный алгоритм для
      общей задачи может и не найти оптимального решения: сразу
      положив в рюкзак самый дорогой предмет, мы можем потерять
      возможность полностью заполнить рюкзак.
А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             12 / 39
Жадный алгоритм или динамическое
программирование?



Замечания




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   13 / 39
Жадный алгоритм или динамическое
программирование?



Замечания
      Итак, в первом случае выполняется принцип жадного выбора, во
      втором — нет. Поэтому непрерывная задача решается жадным
      алгоритмом, общая — динамическим программированием.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            13 / 39
Жадный алгоритм или динамическое
программирование?



Замечания
      Итак, в первом случае выполняется принцип жадного выбора, во
      втором — нет. Поэтому непрерывная задача решается жадным
      алгоритмом, общая — динамическим программированием.
      Слегка модифицировав жадный алгоритм для общей задачи о
      рюкзаке, можно получить 2-приближенный алгоритм.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            13 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   14 / 39
Коды Хаффмена
Коды Хаффмена




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   15 / 39
Коды Хаффмена
Коды Хаффмена
      Рассмотрим строчку длины 130, состоящую только из символов
      A, B, C , D. Более того, допустим, что частота каждого символа
      известна:
                                A B C D
                                70 3 20 37




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              15 / 39
Коды Хаффмена
Коды Хаффмена
      Рассмотрим строчку длины 130, состоящую только из символов
      A, B, C , D. Более того, допустим, что частота каждого символа
      известна:
                                A B C D
                                70 3 20 37
      Наша задача состоит в том, чтобы каждому символу присвоить
      битовый код так, чтобы соответственно закодированная строчка
      имела как можно меньшую длину.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              15 / 39
Коды Хаффмена
Коды Хаффмена
      Рассмотрим строчку длины 130, состоящую только из символов
      A, B, C , D. Более того, допустим, что частота каждого символа
      известна:
                                A B C D
                                70 3 20 37
      Наша задача состоит в том, чтобы каждому символу присвоить
      битовый код так, чтобы соответственно закодированная строчка
      имела как можно меньшую длину.
      Один из вариантов кодирования: A = 00, B = 01, C = 10, D = 11.
      В коде тогда будет 260 бит.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              15 / 39
Коды Хаффмена
Коды Хаффмена
      Рассмотрим строчку длины 130, состоящую только из символов
      A, B, C , D. Более того, допустим, что частота каждого символа
      известна:
                                A B C D
                                70 3 20 37
      Наша задача состоит в том, чтобы каждому символу присвоить
      битовый код так, чтобы соответственно закодированная строчка
      имела как можно меньшую длину.
      Один из вариантов кодирования: A = 00, B = 01, C = 10, D = 11.
      В коде тогда будет 260 бит.
      Интуитивно ясно, что хочется придумать кодирование, при
      котором символ A кодировался бы одним битом (возможно, ценой
      того, что B бы кодировался тремя).

А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              15 / 39
Коды Хаффмена (продолжение)


Коды Хаффмена




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   16 / 39
Коды Хаффмена (продолжение)


Коды Хаффмена
      Однако при кодировании символов последовательностями битов
      разной длины может возникнуть проблема декодировки.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          16 / 39
Коды Хаффмена (продолжение)


Коды Хаффмена
      Однако при кодировании символов последовательностями битов
      разной длины может возникнуть проблема декодировки.
      Одним из способов решения такой проблемы является
      префиксное кодирование.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          16 / 39
Коды Хаффмена (продолжение)


Коды Хаффмена
      Однако при кодировании символов последовательностями битов
      разной длины может возникнуть проблема декодировки.
      Одним из способов решения такой проблемы является
      префиксное кодирование.
      При таком кодировании ни для каких двух символов код одного
      не является префиксом кода другого.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            16 / 39
Коды Хаффмена (продолжение)


Коды Хаффмена
      Однако при кодировании символов последовательностями битов
      разной длины может возникнуть проблема декодировки.
      Одним из способов решения такой проблемы является
      префиксное кодирование.
      При таком кодировании ни для каких двух символов код одного
      не является префиксом кода другого.
      Каждое такое кодирование может быть представлено полным (у
      каждой вершины либо ноль, либо два сына) бинарнынм деревом,
      на ребрах которого стоят 0 и 1, а в листьях — кодируемые
      символы.



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            16 / 39
Пример кодирования



     Дерево                                        Кодирование
                                                         A    B    C    D
                          1                              70   3    20 37
                 0
       A 70                     60                        0 100 101 11
                                     1                 Закодировання строчка
                          0                             содержит 213 битов.
                     23              D 37
                          1
                 0
       B 3                C 20




А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы                     17 / 39
Оптимальное дерево
Оптимальное дерево




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   18 / 39
Оптимальное дерево
Оптимальное дерево
      Наша задача состоит в нахождении такого полного бинарного
      дерева, листья которого помечены символами и которое
      минимизирует стоимость дерева, определяемую как
                         n
                        ∑︁
                                fi · (глубина i-го символа в дереве).
                        i=1




А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы              18 / 39
Оптимальное дерево
Оптимальное дерево
      Наша задача состоит в нахождении такого полного бинарного
      дерева, листья которого помечены символами и которое
      минимизирует стоимость дерева, определяемую как
                         n
                        ∑︁
                                fi · (глубина i-го символа в дереве).
                        i=1


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




А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы              18 / 39
Оптимальное дерево
Оптимальное дерево
      Наша задача состоит в нахождении такого полного бинарного
      дерева, листья которого помечены символами и которое
      минимизирует стоимость дерева, определяемую как
                         n
                        ∑︁
                                fi · (глубина i-го символа в дереве).
                        i=1


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

А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы              18 / 39
Идея жадного построения дерева



Идея жадного построения дерева




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   19 / 39
Идея жадного построения дерева



Идея жадного построения дерева
      Ясно, что два самых редких символа должны висеть в самом низу
      оптимального дерева.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы           19 / 39
Идея жадного построения дерева



Идея жадного построения дерева
      Ясно, что два самых редких символа должны висеть в самом низу
      оптимального дерева.
      НУО, f1 , f2 суть минимальные частоты.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы           19 / 39
Идея жадного построения дерева



Идея жадного построения дерева
      Ясно, что два самых редких символа должны висеть в самом низу
      оптимального дерева.
      НУО, f1 , f2 суть минимальные частоты.
      Стоимость оптимального дерева для частот f1 , . . . fn , в котором f1
      и f2 являются листьями-братьями, равняется сумме (f1 + f2 ) и
      стоимости оптимального дерева для частот (f1 + f2 ), . . . fn .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                    19 / 39
Алгоритм


Huffman(f )
 1    £ Вход: массив частот f [1 . . n]
 2    £ Выход: кодирующее дерево с n листами
 3    создать очередь с приоритетами H, упорядоченную по f
 4    for i ← 1 to n
 5          do Insert(H, i)
 6    for k ← n + 1 to 2n − 1
 7          do i ← Extract-Min(H)
 8             j ← Extract-Min(H)
 9             создать вершину с номером k и сыновьями i, j
10             f [k] ← f [i] + f [j]
11             Insert(H, k)



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          20 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   21 / 39
Задача о покрытии множествами


Определение




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   22 / 39
Задача о покрытии множествами


Определение
      Дано множество U = {u1 , . . . , un } и семейство его подмножеств
      ℱ = {S1 , . . . , Sk }, Si ⊆ U.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                  22 / 39
Задача о покрытии множествами


Определение
      Дано множество U = {u1 , . . . , un } и семейство его подмножеств
      ℱ = {S1 , . . . , Sk }, Si ⊆ U.
                                                        ⋃︀
      В сумме все подмножества покрывают U: U = S∈ℱ S.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                  22 / 39
Задача о покрытии множествами


Определение
      Дано множество U = {u1 , . . . , un } и семейство его подмножеств
      ℱ = {S1 , . . . , Sk }, Si ⊆ U.
                                                        ⋃︀
      В сумме все подмножества покрывают U: U = S∈ℱ S.
      Задача о покрытии множествами (set cover problem) заключается
      в нахождении минимального набора подмножеств, покрывающего
      все множество U.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                  22 / 39
Задача о покрытии множествами


Определение
      Дано множество U = {u1 , . . . , un } и семейство его подмножеств
      ℱ = {S1 , . . . , Sk }, Si ⊆ U.
                                                        ⋃︀
      В сумме все подмножества покрывают U: U = S∈ℱ S.
      Задача о покрытии множествами (set cover problem) заключается
      в нахождении минимального набора подмножеств, покрывающего
      все множество U.

Замечания
В общем случае задача является NP-трудной. Мы построим
приближенный алгоритм, основанный на жадной эвристике.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                  22 / 39
Алгоритм и анализ

Алгоритм и анализ




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   23 / 39
Алгоритм и анализ

Алгоритм и анализ
      Алгоритм на каждом шаге выбирает множество, покрывающее
      маскимальное число все еще не покрытых элементов.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            23 / 39
Алгоритм и анализ

Алгоритм и анализ
      Алгоритм на каждом шаге выбирает множество, покрывающее
      маскимальное число все еще не покрытых элементов.
      Несложно построить пример, на котором такой жадный алгоритм
      выдает неоптимальное решение.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            23 / 39
Алгоритм и анализ

Алгоритм и анализ
      Алгоритм на каждом шаге выбирает множество, покрывающее
      маскимальное число все еще не покрытых элементов.
      Несложно построить пример, на котором такой жадный алгоритм
      выдает неоптимальное решение.
      Можно, однако, показать, что если оптимальное покрытие
      содержит m множеств, то наш жадный алгоритм найдет решение,
      содержащее не более m ln n множеств.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы            23 / 39
Алгоритм и анализ

Алгоритм и анализ
      Алгоритм на каждом шаге выбирает множество, покрывающее
      маскимальное число все еще не покрытых элементов.
      Несложно построить пример, на котором такой жадный алгоритм
      выдает неоптимальное решение.
      Можно, однако, показать, что если оптимальное покрытие
      содержит m множеств, то наш жадный алгоритм найдет решение,
      содержащее не более m ln n множеств.
      Обозначим через nt количество непокрытых элементов после t
      шагов.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               23 / 39
Алгоритм и анализ

Алгоритм и анализ
      Алгоритм на каждом шаге выбирает множество, покрывающее
      маскимальное число все еще не покрытых элементов.
      Несложно построить пример, на котором такой жадный алгоритм
      выдает неоптимальное решение.
      Можно, однако, показать, что если оптимальное покрытие
      содержит m множеств, то наш жадный алгоритм найдет решение,
      содержащее не более m ln n множеств.
      Обозначим через nt количество непокрытых элементов после t
      шагов.
      Поскольку все эти элементы покрыватся m множествами из
      оптимального покрытия, найдется множество, покрывающее хотя
      бы nt /m из них.


А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               23 / 39
Анализ


Анализ




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   24 / 39
Анализ


Анализ
      Значит, жадная эвристика гарантирует, что
                                          (︂      )︂
                                   nt           1
                       nt+1 ≤ nt −    = nt 1 −       .
                                   m            m




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы     24 / 39
Анализ


Анализ
      Значит, жадная эвристика гарантирует, что
                                          (︂      )︂
                                   nt           1
                       nt+1 ≤ nt −    = nt 1 −       .
                                   m            m


      Тогда                     (︂          )︂t
                                        1             (︁     )︁t
                      nt ≤ n0        1−           < n0 e −1/m = ne −t/m .
                                        m




А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы                  24 / 39
Анализ


Анализ
      Значит, жадная эвристика гарантирует, что
                                          (︂      )︂
                                   nt           1
                       nt+1 ≤ nt −    = nt 1 −       .
                                   m            m


      Тогда                     (︂          )︂t
                                        1             (︁     )︁t
                      nt ≤ n0        1−           < n0 e −1/m = ne −t/m .
                                        m

      При t = m ln n, таким образом, nt будет строго меньше 1.




А. Куликов (CS клуб при ПОМИ)         17. Жадные алгоритмы                  24 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   25 / 39
Задача о вершинном покрытии

Определение
Задача о вершинном покрытии (vertex cover problem) заключается в
нахождении по данному графу G = (V , E ) такого минимального его
подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы
одна из вершин u и v содержится в V ′ .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             26 / 39
Задача о вершинном покрытии

Определение
Задача о вершинном покрытии (vertex cover problem) заключается в
нахождении по данному графу G = (V , E ) такого минимального его
подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы
одна из вершин u и v содержится в V ′ .

Простой жадный алгоритм




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             26 / 39
Задача о вершинном покрытии

Определение
Задача о вершинном покрытии (vertex cover problem) заключается в
нахождении по данному графу G = (V , E ) такого минимального его
подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы
одна из вершин u и v содержится в V ′ .

Простой жадный алгоритм
      Рассмотрим следующий жадный алгоритм: на каждом шаге
      выбираем вершину максимальной степени и выкидываем из
      графа все покрытые ребра.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             26 / 39
Задача о вершинном покрытии

Определение
Задача о вершинном покрытии (vertex cover problem) заключается в
нахождении по данному графу G = (V , E ) такого минимального его
подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы
одна из вершин u и v содержится в V ′ .

Простой жадный алгоритм
      Рассмотрим следующий жадный алгоритм: на каждом шаге
      выбираем вершину максимальной степени и выкидываем из
      графа все покрытые ребра.
      Мы покажем, что для любой константы c найдется граф, для
      которого этот алгоритм выдаст покрытие, которое по размеру
      будет более чем в c раз хуже оптимального.


А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               26 / 39
Идея конструкции

Идея конструкции




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.
      Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.
      Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi .
      Таким образом, deg(v ) = i для любой v ∈ Vi .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.
      Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi .
      Таким образом, deg(v ) = i для любой v ∈ Vi .
      Ясно, что U является вершинным покрытием.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.
      Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi .
      Таким образом, deg(v ) = i для любой v ∈ Vi .
      Ясно, что U является вершинным покрытием.
      Жадный же алгоритм может последовательно выбрать сначала
      все вершины из Vn , потом все вершины из Vn−1 и т.д.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             27 / 39
Идея конструкции

Идея конструкции
      Рассматриваем двудольный граф на долях U и V .
      |U| = n!.
      V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i.
      Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi .
      Таким образом, deg(v ) = i для любой v ∈ Vi .
      Ясно, что U является вершинным покрытием.
      Жадный же алгоритм может последовательно выбрать сначала
      все вершины из Vn , потом все вершины из Vn−1 и т.д.
      Полученное покрытие будет содержать
      n!(1/n + 1/(n − 1) + · · · + 1) вершин.



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             27 / 39
Пример для n = 6




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   28 / 39
План лекции

1   Введение
      Что такое жадный алгоритм?
      Пример: задача о выборе заявок
      Когда применимы жадные алгоритмы?

2   Коды Хаффмена

3   Покрытие множествами

4   Вершинное покрытие

5   Локальный поиск для SAT



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   29 / 39
Формула в КНФ
Определение




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   30 / 39
Формула в КНФ
Определение
      Пропозициональной или Булевой (propositional, Boolean)
      переменной называется переменная, принимающая значения true
      (1) и false (0).




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы          30 / 39
Формула в КНФ
Определение
      Пропозициональной или Булевой (propositional, Boolean)
      переменной называется переменная, принимающая значения true
      (1) и false (0).
      Литералом (literal) называется Булева переменная x или ее
      отрицание ¬x.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              30 / 39
Формула в КНФ
Определение
      Пропозициональной или Булевой (propositional, Boolean)
      переменной называется переменная, принимающая значения true
      (1) и false (0).
      Литералом (literal) называется Булева переменная x или ее
      отрицание ¬x.
      Клозом (clause) называется дизъюнкция конечного множества
      литералов, не содержащего одновременно переменной и ее
      отрицания.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              30 / 39
Формула в КНФ
Определение
      Пропозициональной или Булевой (propositional, Boolean)
      переменной называется переменная, принимающая значения true
      (1) и false (0).
      Литералом (literal) называется Булева переменная x или ее
      отрицание ¬x.
      Клозом (clause) называется дизъюнкция конечного множества
      литералов, не содержащего одновременно переменной и ее
      отрицания.
      k-клозом (k-clause) называется клоз, содержащий ровно k
      литералов.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              30 / 39
Формула в КНФ
Определение
      Пропозициональной или Булевой (propositional, Boolean)
      переменной называется переменная, принимающая значения true
      (1) и false (0).
      Литералом (literal) называется Булева переменная x или ее
      отрицание ¬x.
      Клозом (clause) называется дизъюнкция конечного множества
      литералов, не содержащего одновременно переменной и ее
      отрицания.
      k-клозом (k-clause) называется клоз, содержащий ровно k
      литералов.
      Формулой в конъюнктивной нормальной форме (КНФ) (formula in
      conjunctive normal form, CNF) называется конъюнкция конечного
      множества клозов.

А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              30 / 39
Задача выполнимости

Определение
Задача пропозициональной выполнимости (Boolean satisfiability
problem, SAT): определить, выполнима ли данная формула в КНФ, то
есть существует ли набор Булевых значений переменным формулы,
выполняющий формулу. Такой набор называют выполняющим
(satisfying assignment), а формулу, для которой такой набор
существует, — выполнимой (satisfiable).




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы         31 / 39
Задача выполнимости

Определение
Задача пропозициональной выполнимости (Boolean satisfiability
problem, SAT): определить, выполнима ли данная формула в КНФ, то
есть существует ли набор Булевых значений переменным формулы,
выполняющий формулу. Такой набор называют выполняющим
(satisfying assignment), а формулу, для которой такой набор
существует, — выполнимой (satisfiable).

Пример




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы         31 / 39
Задача выполнимости

Определение
Задача пропозициональной выполнимости (Boolean satisfiability
problem, SAT): определить, выполнима ли данная формула в КНФ, то
есть существует ли набор Булевых значений переменным формулы,
выполняющий формулу. Такой набор называют выполняющим
(satisfying assignment), а формулу, для которой такой набор
существует, — выполнимой (satisfiable).

Пример
      F1 = (x ∨ y ∨ ¬z) ∧ (¬x) ∧ (¬y ∨ z)
      F1 выполнима: x = 0, y = 1, z = 1




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы         31 / 39
Задача выполнимости

Определение
Задача пропозициональной выполнимости (Boolean satisfiability
problem, SAT): определить, выполнима ли данная формула в КНФ, то
есть существует ли набор Булевых значений переменным формулы,
выполняющий формулу. Такой набор называют выполняющим
(satisfying assignment), а формулу, для которой такой набор
существует, — выполнимой (satisfiable).

Пример
      F1 = (x ∨ y ∨ ¬z) ∧ (¬x) ∧ (¬y ∨ z)
      F1 выполнима: x = 0, y = 1, z = 1
      F2 = (x ∨ y ) ∧ (x ∨ ¬y ) ∧ (¬x ∨ y ) ∧ (¬x ∨ ¬y )
      F2 невыполнима, но три клоза можно выполнить


А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы         31 / 39
Жадный локальный поиск


GSAT(F , maxflips, maxtries)
1 for i ← 1 to maxtries
2       do выбрать случайный набор I
3          for j ← 1 to maxflips
4               do если I выполняет F , вернуть I
5                  выбрать переменную v , при изменении которой
                   выполняется максимальное возможное
                   количество клозов F
6                  изменить значение переменной v в наборе I
7 return “не знаю”




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              32 / 39
Сложная формула для алгоритма
  первый тип клозов             (x1 ∨ ¬x2 ), (x2 ∨ ¬x3 ), . . . , (xn ∨ ¬x1 )
  второй тип клозов             (x1 ∨ x2 )
  третий тип клозов             (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn−2 ∨ ¬xn−1 )
                                (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn−1 ∨ ¬xn )
                                (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn ∨ ¬xn−2 )

                                (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬xn−1 ∨ ¬xn )
                                (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬xn ∨ ¬x1 )
                                (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬x1 ∨ ¬xn−1 )
                                ...
                                (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−3 ∨ ¬xn−2 )
                                (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−2 ∨ ¬xn−1 )
                                (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−1 ∨ ¬xn−3 )

А. Куликов (CS клуб при ПОМИ)        17. Жадные алгоритмы                       33 / 39
Идеи доказательства

Идеи доказательства




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   34 / 39
Идеи доказательства

Идеи доказательства
      Выполняющий набор у формулы всего один.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   34 / 39
Идеи доказательства

Идеи доказательства
      Выполняющий набор у формулы всего один.
      Если текущий набор алгоритма находится на расстоянии 2 от
      выполняющего, то следующим шагом алгоритм обязательно
      сделает неверный ход.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              34 / 39
Идеи доказательства

Идеи доказательства
      Выполняющий набор у формулы всего один.
      Если текущий набор алгоритма находится на расстоянии 2 от
      выполняющего, то следующим шагом алгоритм обязательно
      сделает неверный ход.
      Таким образом, если случайно выбранный набор не попадет в
      множество наборов, находящихся на расстоянии не более 1 от
      выполняющего, то жадный алгоритм за одно блуждание его не
      найдёт.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы              34 / 39
Идеи доказательства

Идеи доказательства
      Выполняющий набор у формулы всего один.
      Если текущий набор алгоритма находится на расстоянии 2 от
      выполняющего, то следующим шагом алгоритм обязательно
      сделает неверный ход.
      Таким образом, если случайно выбранный набор не попадет в
      множество наборов, находящихся на расстоянии не более 1 от
      выполняющего, то жадный алгоритм за одно блуждание его не
      найдёт.
      Поскольку всего различных наборов 2n , а упомянутых — всего
      n + 1, жадный алгоритм находит выполняющий набор с
      экспоненциально маленькой вероятностью.



А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                34 / 39
Формальное доказательство


Теорема
Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий
набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой
переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов,
чем I .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               35 / 39
Формальное доказательство


Теорема
Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий
набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой
переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов,
чем I .

Доказательство




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               35 / 39
Формальное доказательство


Теорема
Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий
набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой
переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов,
чем I .

Доказательство
      Пусть I отличается от S значениями переменных v = xi и xj .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                35 / 39
Формальное доказательство


Теорема
Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий
набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой
переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов,
чем I .

Доказательство
      Пусть I отличается от S значениями переменных v = xi и xj .
      Ясно, что I v выполняет клоз (x1 ∨ x2 ), 3n − 3 клоза третьего типа
      и n − 1 клозов первого типа. Всего 4n − 3 клоза, таким образом.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                 35 / 39
Формальное доказательство (продолжение)



Доказательство




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   36 / 39
Формальное доказательство (продолжение)



Доказательство
      Рассмотрим три случая:




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   36 / 39
Формальное доказательство (продолжение)



Доказательство
      Рассмотрим три случая:
         1   |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа,
                                ̸
             клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее
             4n − 2.




А. Куликов (CS клуб при ПОМИ)    17. Жадные алгоритмы                        36 / 39
Формальное доказательство (продолжение)



Доказательство
      Рассмотрим три случая:
         1   |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа,
                                ̸
             клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее
             4n − 2.
         2   |(i − j) (mod n)| = 1, но {i, j} = {1, 2}. Тогда n − 1 клоза первого
                                              ̸
             типа, клоз (x1 ∨ x2 ) и 3n − 1 клозов третьего типа. Итого 4n − 1.




А. Куликов (CS клуб при ПОМИ)    17. Жадные алгоритмы                        36 / 39
Формальное доказательство (продолжение)



Доказательство
      Рассмотрим три случая:
         1   |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа,
                                ̸
             клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее
             4n − 2.
         2   |(i − j) (mod n)| = 1, но {i, j} = {1, 2}. Тогда n − 1 клоза первого
                                              ̸
             типа, клоз (x1 ∨ x2 ) и 3n − 1 клозов третьего типа. Итого 4n − 1.
         3   {i, j} = {1, 2}. n − 1 клоз первого типа и 3n − 1 клоза третьего
             типа. 4n − 2 клоза.




А. Куликов (CS клуб при ПОМИ)    17. Жадные алгоритмы                        36 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                   37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                   37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство
      Пусть I отличается от S значениями переменных xi и xj .




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                   37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство
      Пусть I отличается от S значениями переменных xi и xj .
      Выберем v так, чтобы




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                   37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство
      Пусть I отличается от S значениями переменных xi и xj .
      Выберем v так, чтобы
         1   v ̸= x1 , x2 ;




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы                   37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство
      Пусть I отличается от S значениями переменных xi и xj .
      Выберем v так, чтобы
         1   v ̸= x1 , x2 ;
         2   выполнено ровно одно из условий: v = xj+1 , v = xj−1 , v = xi+1 , ,
             v = xi−1 (это возможно при n ≥ 6).




А. Куликов (CS клуб при ПОМИ)    17. Жадные алгоритмы                         37 / 39
Завершающая теорема

Теорема
Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v ,
такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I .

Доказательство
      Пусть I отличается от S значениями переменных xi и xj .
      Выберем v так, чтобы
         1   v ̸= x1 , x2 ;
         2   выполнено ровно одно из условий: v = xj+1 , v = xj−1 , v = xi+1 , ,
             v = xi−1 (это возможно при n ≥ 6).
      Нетрудно видеть, что тогда I v выполняет те же клозы второго и
      третьего типов, что и I , и столько же клозов первого типа, что и
      I.


А. Куликов (CS клуб при ПОМИ)    17. Жадные алгоритмы                         37 / 39
Что мы узнали за сегодня?



Что мы узнали за сегодня?




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   38 / 39
Что мы узнали за сегодня?



Что мы узнали за сегодня?
      Две отличительные особенности жадного алгоритма: принцип
      жадного выбора и свойство оптимальности для подзадач.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             38 / 39
Что мы узнали за сегодня?



Что мы узнали за сегодня?
      Две отличительные особенности жадного алгоритма: принцип
      жадного выбора и свойство оптимальности для подзадач.
      Свойство оптимальности для подзадач выполняется и для
      динамического программирования.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы             38 / 39
Что мы узнали за сегодня?



Что мы узнали за сегодня?
      Две отличительные особенности жадного алгоритма: принцип
      жадного выбора и свойство оптимальности для подзадач.
      Свойство оптимальности для подзадач выполняется и для
      динамического программирования.
      Жадная стратегия в ряде случае находит решение, которое не
      сильно хуже оптимального.




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы               38 / 39
Спасибо за внимание!




А. Куликов (CS клуб при ПОМИ)   17. Жадные алгоритмы   39 / 39

More Related Content

Viewers also liked

Ring a hole competion 2012
Ring a hole competion 2012Ring a hole competion 2012
Ring a hole competion 2012CJH47
 
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 ManualCembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
Thorne & Derrick International
 
AS VIAGENS DE GULIVER - Jonathan Swift
AS VIAGENS DE GULIVER - Jonathan SwiftAS VIAGENS DE GULIVER - Jonathan Swift
AS VIAGENS DE GULIVER - Jonathan SwiftEdson Mamprin
 
Apresentação (cobiho) chile
Apresentação (cobiho) chileApresentação (cobiho) chile
Kenshin himura. horacio german garcia
Kenshin himura. horacio german garciaKenshin himura. horacio german garcia
Kenshin himura. horacio german garciaRobertoOtazu
 
Bagaimana menjual-produk-informasi
Bagaimana menjual-produk-informasiBagaimana menjual-produk-informasi
Bagaimana menjual-produk-informasi
Sejahtera Affif
 
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
CIDAADS
 
Painel de cotrolo(beatriz, carina, carolina e ines)
Painel de cotrolo(beatriz, carina, carolina e ines)Painel de cotrolo(beatriz, carina, carolina e ines)
Painel de cotrolo(beatriz, carina, carolina e ines)nonoano_terceira
 
Copa 2010 jogos_pnt
Copa 2010 jogos_pntCopa 2010 jogos_pnt
Copa 2010 jogos_pntStudiesfree
 
Ap m5 ak kliring
Ap m5 ak kliringAp m5 ak kliring
Ap m5 ak kliring
Sejahtera Affif
 
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
Ian Pullas
 
Урок №1 Открытое чтение
Урок №1 Открытое чтениеУрок №1 Открытое чтение
Урок №1 Открытое чтение
Школьная лига РОСНАНО
 

Viewers also liked (15)

Ring a hole competion 2012
Ring a hole competion 2012Ring a hole competion 2012
Ring a hole competion 2012
 
Dia 3
Dia 3Dia 3
Dia 3
 
Experience QS
Experience QSExperience QS
Experience QS
 
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 ManualCembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
Cembre PO 7000 Hydraulic Cable Cutting Tool Foot Pump - PO 7000 Manual
 
AS VIAGENS DE GULIVER - Jonathan Swift
AS VIAGENS DE GULIVER - Jonathan SwiftAS VIAGENS DE GULIVER - Jonathan Swift
AS VIAGENS DE GULIVER - Jonathan Swift
 
Apresentação (cobiho) chile
Apresentação (cobiho) chileApresentação (cobiho) chile
Apresentação (cobiho) chile
 
Kenshin himura. horacio german garcia
Kenshin himura. horacio german garciaKenshin himura. horacio german garcia
Kenshin himura. horacio german garcia
 
Bagaimana menjual-produk-informasi
Bagaimana menjual-produk-informasiBagaimana menjual-produk-informasi
Bagaimana menjual-produk-informasi
 
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
Painel3 - Autobiografia Ambiental de escola. O exemplo da Lajes do Pico - Olg...
 
Painel de cotrolo(beatriz, carina, carolina e ines)
Painel de cotrolo(beatriz, carina, carolina e ines)Painel de cotrolo(beatriz, carina, carolina e ines)
Painel de cotrolo(beatriz, carina, carolina e ines)
 
einkunnir og meðmæli
einkunnir og meðmælieinkunnir og meðmæli
einkunnir og meðmæli
 
Copa 2010 jogos_pnt
Copa 2010 jogos_pntCopa 2010 jogos_pnt
Copa 2010 jogos_pnt
 
Ap m5 ak kliring
Ap m5 ak kliringAp m5 ak kliring
Ap m5 ak kliring
 
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
Grupo2 150330183213-conversion-gate01-150331165257-conversion-gate01
 
Урок №1 Открытое чтение
Урок №1 Открытое чтениеУрок №1 Открытое чтение
Урок №1 Открытое чтение
 

Similar to 20080316 efficientalgorithms kulikov_lecture17

20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13Computer Science Club
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13Computer Science Club
 
20071007 efficientalgorithms kulikov_lecture03
20071007 efficientalgorithms kulikov_lecture0320071007 efficientalgorithms kulikov_lecture03
20071007 efficientalgorithms kulikov_lecture03Computer Science Club
 
20091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture0320091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture03Computer Science Club
 
20080224 efficientalgorithms kulikov_lecture14
20080224 efficientalgorithms kulikov_lecture1420080224 efficientalgorithms kulikov_lecture14
20080224 efficientalgorithms kulikov_lecture14Computer Science Club
 
20071125 efficientalgorithms kulikov_lecture10
20071125 efficientalgorithms kulikov_lecture1020071125 efficientalgorithms kulikov_lecture10
20071125 efficientalgorithms kulikov_lecture10Computer Science Club
 
Лекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыЛекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмы
simple_people
 
20080406 efficientalgorithms kulikov_lecture21
20080406 efficientalgorithms kulikov_lecture2120080406 efficientalgorithms kulikov_lecture21
20080406 efficientalgorithms kulikov_lecture21Computer Science Club
 
20091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture0420091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture04Computer Science Club
 

Similar to 20080316 efficientalgorithms kulikov_lecture17 (10)

20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13
 
20080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture1320080217 efficientalgorithms kulikov_lecture13
20080217 efficientalgorithms kulikov_lecture13
 
20071007 efficientalgorithms kulikov_lecture03
20071007 efficientalgorithms kulikov_lecture0320071007 efficientalgorithms kulikov_lecture03
20071007 efficientalgorithms kulikov_lecture03
 
20091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture0320091025 algorithmsfornphardproblems kulikov_lecture03
20091025 algorithmsfornphardproblems kulikov_lecture03
 
20080224 efficientalgorithms kulikov_lecture14
20080224 efficientalgorithms kulikov_lecture1420080224 efficientalgorithms kulikov_lecture14
20080224 efficientalgorithms kulikov_lecture14
 
лекция 8
лекция 8лекция 8
лекция 8
 
20071125 efficientalgorithms kulikov_lecture10
20071125 efficientalgorithms kulikov_lecture1020071125 efficientalgorithms kulikov_lecture10
20071125 efficientalgorithms kulikov_lecture10
 
Лекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмыЛекция 9 Жадные алгоритмы
Лекция 9 Жадные алгоритмы
 
20080406 efficientalgorithms kulikov_lecture21
20080406 efficientalgorithms kulikov_lecture2120080406 efficientalgorithms kulikov_lecture21
20080406 efficientalgorithms kulikov_lecture21
 
20091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture0420091025 algorithmsfornphardproblems kulikov_lecture04
20091025 algorithmsfornphardproblems kulikov_lecture04
 

More from Computer Science Club

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
Computer Science Club
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
Computer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugsComputer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12Computer Science Club
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11Computer Science Club
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10Computer Science Club
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09Computer Science Club
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02Computer Science Club
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01Computer Science Club
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01Computer Science Club
 

More from Computer Science Club (20)

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
20140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-0320140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-03
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01
 
20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 

20080316 efficientalgorithms kulikov_lecture17

  • 1. с/к “Эффективные алгоритмы” Лекция 17: Жадные алгоритмы А. Куликов Computer Science клуб при ПОМИ http://logic.pdmi.ras.ru/∼infclub/ А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 1 / 39
  • 2. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 2 / 39
  • 3. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 2 / 39
  • 4. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 2 / 39
  • 5. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 2 / 39
  • 6. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 2 / 39
  • 7. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 3 / 39
  • 8. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 4 / 39
  • 9. Общая идея Общая идея А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 5 / 39
  • 10. Общая идея Общая идея На каждом шаге жадный алгоритм делает локально оптимальный выбор. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 5 / 39
  • 11. Общая идея Общая идея На каждом шаге жадный алгоритм делает локально оптимальный выбор. Решение, найденное таким образом, не всегда оказывается оптимальным, но в ряде случаев все-таки оказывается. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 5 / 39
  • 12. Общая идея Общая идея На каждом шаге жадный алгоритм делает локально оптимальный выбор. Решение, найденное таким образом, не всегда оказывается оптимальным, но в ряде случаев все-таки оказывается. Общеизвестный пример — алгоритм для построения минимального покрывающего дерева: на каждом шаге берется самое легкое из возможных ребер. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 5 / 39
  • 13. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 6 / 39
  • 14. Задача о выборе заявок Определение А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 7 / 39
  • 15. Задача о выборе заявок Определение Даны n пар чисел (si , fi ), где si < fi обозначает время начала занятия, а fi — конец. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 7 / 39
  • 16. Задача о выборе заявок Определение Даны n пар чисел (si , fi ), где si < fi обозначает время начала занятия, а fi — конец. Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 7 / 39
  • 17. Задача о выборе заявок Определение Даны n пар чисел (si , fi ), где si < fi обозначает время начала занятия, а fi — конец. Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si . Задача о выборе заявок (activity-selection problem) заключается в выборе максимального количества совместных друг с другом заявок. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 7 / 39
  • 18. Задача о выборе заявок Определение Даны n пар чисел (si , fi ), где si < fi обозначает время начала занятия, а fi — конец. Говорим, что заявки (si , fi ) и (sj , fj ) совместны, если интервалы [si , fi ) и [sj , fj ) не пересекаются: fi ≤ sj или fj ≤ si . Задача о выборе заявок (activity-selection problem) заключается в выборе максимального количества совместных друг с другом заявок. Замечание Будем считать, что заявки отсортированы в порядке возрастания времени окончания: f1 ≤ f2 ≤ · · · ≤ fn . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 7 / 39
  • 19. Алгоритм Greedy-Activity-Selector(s, f ) 1 n ← length[s] 2 A ← {1} 3 j ←1 4 for i ← 2 to n 5 do if si ≥ fj 6 then A ← A ∪ {i} 7 j ←i 8 return A А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 8 / 39
  • 20. Анализ алгоритма Анализ алгоритма А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 9 / 39
  • 21. Анализ алгоритма Анализ алгоритма Время работы есть Θ(n) (при условии, что заявки отсортированы!). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 9 / 39
  • 22. Анализ алгоритма Анализ алгоритма Время работы есть Θ(n) (при условии, что заявки отсортированы!). Существует оптимальное решение, содержащее заявку 1: если в некотором оптимальном множестве заявка 1 не содержится, то первую заявку (то есть заявку с самым ранним временем окончания) этого множества можно заменить на заявку 1. При такой операции совместность не нарушится, а количество заявок останется прежним. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 9 / 39
  • 23. Анализ алгоритма Анализ алгоритма Время работы есть Θ(n) (при условии, что заявки отсортированы!). Существует оптимальное решение, содержащее заявку 1: если в некотором оптимальном множестве заявка 1 не содержится, то первую заявку (то есть заявку с самым ранним временем окончания) этого множества можно заменить на заявку 1. При такой операции совместность не нарушится, а количество заявок останется прежним. Итак, мы ищем решение, содержащее заявку 1. Значит, можно выкинуть все заявки, несовмеcтные с ней. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 9 / 39
  • 24. Анализ алгоритма Анализ алгоритма Время работы есть Θ(n) (при условии, что заявки отсортированы!). Существует оптимальное решение, содержащее заявку 1: если в некотором оптимальном множестве заявка 1 не содержится, то первую заявку (то есть заявку с самым ранним временем окончания) этого множества можно заменить на заявку 1. При такой операции совместность не нарушится, а количество заявок останется прежним. Итак, мы ищем решение, содержащее заявку 1. Значит, можно выкинуть все заявки, несовмеcтные с ней. Получаем подзадачу с меньшим количеством заявок. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 9 / 39
  • 25. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 10 / 39
  • 26. Когда применимы жадные алгоритмы? Две отличительные особенности жадных алгоритмов А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 11 / 39
  • 27. Когда применимы жадные алгоритмы? Две отличительные особенности жадных алгоритмов 1 Принцип жадного выбора: последовательность локально оптимальных (жадных) выборов дает глобально оптимальное решение. Для установления этого свойства, как правило, нужно показать, что жадный выбор согласован с некоторым оптимальным решением и что после выбора получается аналогичная подзадача. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 11 / 39
  • 28. Когда применимы жадные алгоритмы? Две отличительные особенности жадных алгоритмов 1 Принцип жадного выбора: последовательность локально оптимальных (жадных) выборов дает глобально оптимальное решение. Для установления этого свойства, как правило, нужно показать, что жадный выбор согласован с некоторым оптимальным решением и что после выбора получается аналогичная подзадача. 2 Свойство оптимальности для подзадач: оптимальное решение для задачи содержит оптимальные решения для подзадач. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 11 / 39
  • 29. Жадный алгоритм или динамическое программирование? Определение В непрерывной задаче о рюкзаке (fractional knapsack problem), в отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части предметов. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 12 / 39
  • 30. Жадный алгоритм или динамическое программирование? Определение В непрерывной задаче о рюкзаке (fractional knapsack problem), в отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части предметов. Замечания А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 12 / 39
  • 31. Жадный алгоритм или динамическое программирование? Определение В непрерывной задаче о рюкзаке (fractional knapsack problem), в отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части предметов. Замечания Нетрудно видеть, что жадный алгоритм находит оптимальное решение для непрерывной задачи о рюкзаке: на каждом шаге добавляем максимальное количество предмета максимальной удельной стоимости (стоимость/объём). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 12 / 39
  • 32. Жадный алгоритм или динамическое программирование? Определение В непрерывной задаче о рюкзаке (fractional knapsack problem), в отличие от общей задачи о рюкзаке, в рюкзак разрешать класть части предметов. Замечания Нетрудно видеть, что жадный алгоритм находит оптимальное решение для непрерывной задачи о рюкзаке: на каждом шаге добавляем максимальное количество предмета максимальной удельной стоимости (стоимость/объём). Нетрудно также убедиться в том, что аналогичный алгоритм для общей задачи может и не найти оптимального решения: сразу положив в рюкзак самый дорогой предмет, мы можем потерять возможность полностью заполнить рюкзак. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 12 / 39
  • 33. Жадный алгоритм или динамическое программирование? Замечания А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 13 / 39
  • 34. Жадный алгоритм или динамическое программирование? Замечания Итак, в первом случае выполняется принцип жадного выбора, во втором — нет. Поэтому непрерывная задача решается жадным алгоритмом, общая — динамическим программированием. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 13 / 39
  • 35. Жадный алгоритм или динамическое программирование? Замечания Итак, в первом случае выполняется принцип жадного выбора, во втором — нет. Поэтому непрерывная задача решается жадным алгоритмом, общая — динамическим программированием. Слегка модифицировав жадный алгоритм для общей задачи о рюкзаке, можно получить 2-приближенный алгоритм. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 13 / 39
  • 36. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 14 / 39
  • 37. Коды Хаффмена Коды Хаффмена А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 15 / 39
  • 38. Коды Хаффмена Коды Хаффмена Рассмотрим строчку длины 130, состоящую только из символов A, B, C , D. Более того, допустим, что частота каждого символа известна: A B C D 70 3 20 37 А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 15 / 39
  • 39. Коды Хаффмена Коды Хаффмена Рассмотрим строчку длины 130, состоящую только из символов A, B, C , D. Более того, допустим, что частота каждого символа известна: A B C D 70 3 20 37 Наша задача состоит в том, чтобы каждому символу присвоить битовый код так, чтобы соответственно закодированная строчка имела как можно меньшую длину. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 15 / 39
  • 40. Коды Хаффмена Коды Хаффмена Рассмотрим строчку длины 130, состоящую только из символов A, B, C , D. Более того, допустим, что частота каждого символа известна: A B C D 70 3 20 37 Наша задача состоит в том, чтобы каждому символу присвоить битовый код так, чтобы соответственно закодированная строчка имела как можно меньшую длину. Один из вариантов кодирования: A = 00, B = 01, C = 10, D = 11. В коде тогда будет 260 бит. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 15 / 39
  • 41. Коды Хаффмена Коды Хаффмена Рассмотрим строчку длины 130, состоящую только из символов A, B, C , D. Более того, допустим, что частота каждого символа известна: A B C D 70 3 20 37 Наша задача состоит в том, чтобы каждому символу присвоить битовый код так, чтобы соответственно закодированная строчка имела как можно меньшую длину. Один из вариантов кодирования: A = 00, B = 01, C = 10, D = 11. В коде тогда будет 260 бит. Интуитивно ясно, что хочется придумать кодирование, при котором символ A кодировался бы одним битом (возможно, ценой того, что B бы кодировался тремя). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 15 / 39
  • 42. Коды Хаффмена (продолжение) Коды Хаффмена А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 16 / 39
  • 43. Коды Хаффмена (продолжение) Коды Хаффмена Однако при кодировании символов последовательностями битов разной длины может возникнуть проблема декодировки. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 16 / 39
  • 44. Коды Хаффмена (продолжение) Коды Хаффмена Однако при кодировании символов последовательностями битов разной длины может возникнуть проблема декодировки. Одним из способов решения такой проблемы является префиксное кодирование. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 16 / 39
  • 45. Коды Хаффмена (продолжение) Коды Хаффмена Однако при кодировании символов последовательностями битов разной длины может возникнуть проблема декодировки. Одним из способов решения такой проблемы является префиксное кодирование. При таком кодировании ни для каких двух символов код одного не является префиксом кода другого. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 16 / 39
  • 46. Коды Хаффмена (продолжение) Коды Хаффмена Однако при кодировании символов последовательностями битов разной длины может возникнуть проблема декодировки. Одним из способов решения такой проблемы является префиксное кодирование. При таком кодировании ни для каких двух символов код одного не является префиксом кода другого. Каждое такое кодирование может быть представлено полным (у каждой вершины либо ноль, либо два сына) бинарнынм деревом, на ребрах которого стоят 0 и 1, а в листьях — кодируемые символы. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 16 / 39
  • 47. Пример кодирования Дерево Кодирование A B C D 1 70 3 20 37 0 A 70 60 0 100 101 11 1 Закодировання строчка 0 содержит 213 битов. 23 D 37 1 0 B 3 C 20 А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 17 / 39
  • 48. Оптимальное дерево Оптимальное дерево А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 18 / 39
  • 49. Оптимальное дерево Оптимальное дерево Наша задача состоит в нахождении такого полного бинарного дерева, листья которого помечены символами и которое минимизирует стоимость дерева, определяемую как n ∑︁ fi · (глубина i-го символа в дереве). i=1 А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 18 / 39
  • 50. Оптимальное дерево Оптимальное дерево Наша задача состоит в нахождении такого полного бинарного дерева, листья которого помечены символами и которое минимизирует стоимость дерева, определяемую как n ∑︁ fi · (глубина i-го символа в дереве). i=1 Определим частоту внутренней вершины дерева как сумму частот её сыновей. Нетрудно видеть, что при таком определении частота каждой вершины дерева равняется просто количеству посещений этой вершины при кодировании или декодировании. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 18 / 39
  • 51. Оптимальное дерево Оптимальное дерево Наша задача состоит в нахождении такого полного бинарного дерева, листья которого помечены символами и которое минимизирует стоимость дерева, определяемую как n ∑︁ fi · (глубина i-го символа в дереве). i=1 Определим частоту внутренней вершины дерева как сумму частот её сыновей. Нетрудно видеть, что при таком определении частота каждой вершины дерева равняется просто количеству посещений этой вершины при кодировании или декодировании. Стоимость дерева тогда равняется сумме частот всех вершин дерева кроме корня. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 18 / 39
  • 52. Идея жадного построения дерева Идея жадного построения дерева А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 19 / 39
  • 53. Идея жадного построения дерева Идея жадного построения дерева Ясно, что два самых редких символа должны висеть в самом низу оптимального дерева. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 19 / 39
  • 54. Идея жадного построения дерева Идея жадного построения дерева Ясно, что два самых редких символа должны висеть в самом низу оптимального дерева. НУО, f1 , f2 суть минимальные частоты. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 19 / 39
  • 55. Идея жадного построения дерева Идея жадного построения дерева Ясно, что два самых редких символа должны висеть в самом низу оптимального дерева. НУО, f1 , f2 суть минимальные частоты. Стоимость оптимального дерева для частот f1 , . . . fn , в котором f1 и f2 являются листьями-братьями, равняется сумме (f1 + f2 ) и стоимости оптимального дерева для частот (f1 + f2 ), . . . fn . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 19 / 39
  • 56. Алгоритм Huffman(f ) 1 £ Вход: массив частот f [1 . . n] 2 £ Выход: кодирующее дерево с n листами 3 создать очередь с приоритетами H, упорядоченную по f 4 for i ← 1 to n 5 do Insert(H, i) 6 for k ← n + 1 to 2n − 1 7 do i ← Extract-Min(H) 8 j ← Extract-Min(H) 9 создать вершину с номером k и сыновьями i, j 10 f [k] ← f [i] + f [j] 11 Insert(H, k) А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 20 / 39
  • 57. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 21 / 39
  • 58. Задача о покрытии множествами Определение А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 22 / 39
  • 59. Задача о покрытии множествами Определение Дано множество U = {u1 , . . . , un } и семейство его подмножеств ℱ = {S1 , . . . , Sk }, Si ⊆ U. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 22 / 39
  • 60. Задача о покрытии множествами Определение Дано множество U = {u1 , . . . , un } и семейство его подмножеств ℱ = {S1 , . . . , Sk }, Si ⊆ U. ⋃︀ В сумме все подмножества покрывают U: U = S∈ℱ S. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 22 / 39
  • 61. Задача о покрытии множествами Определение Дано множество U = {u1 , . . . , un } и семейство его подмножеств ℱ = {S1 , . . . , Sk }, Si ⊆ U. ⋃︀ В сумме все подмножества покрывают U: U = S∈ℱ S. Задача о покрытии множествами (set cover problem) заключается в нахождении минимального набора подмножеств, покрывающего все множество U. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 22 / 39
  • 62. Задача о покрытии множествами Определение Дано множество U = {u1 , . . . , un } и семейство его подмножеств ℱ = {S1 , . . . , Sk }, Si ⊆ U. ⋃︀ В сумме все подмножества покрывают U: U = S∈ℱ S. Задача о покрытии множествами (set cover problem) заключается в нахождении минимального набора подмножеств, покрывающего все множество U. Замечания В общем случае задача является NP-трудной. Мы построим приближенный алгоритм, основанный на жадной эвристике. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 22 / 39
  • 63. Алгоритм и анализ Алгоритм и анализ А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 64. Алгоритм и анализ Алгоритм и анализ Алгоритм на каждом шаге выбирает множество, покрывающее маскимальное число все еще не покрытых элементов. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 65. Алгоритм и анализ Алгоритм и анализ Алгоритм на каждом шаге выбирает множество, покрывающее маскимальное число все еще не покрытых элементов. Несложно построить пример, на котором такой жадный алгоритм выдает неоптимальное решение. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 66. Алгоритм и анализ Алгоритм и анализ Алгоритм на каждом шаге выбирает множество, покрывающее маскимальное число все еще не покрытых элементов. Несложно построить пример, на котором такой жадный алгоритм выдает неоптимальное решение. Можно, однако, показать, что если оптимальное покрытие содержит m множеств, то наш жадный алгоритм найдет решение, содержащее не более m ln n множеств. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 67. Алгоритм и анализ Алгоритм и анализ Алгоритм на каждом шаге выбирает множество, покрывающее маскимальное число все еще не покрытых элементов. Несложно построить пример, на котором такой жадный алгоритм выдает неоптимальное решение. Можно, однако, показать, что если оптимальное покрытие содержит m множеств, то наш жадный алгоритм найдет решение, содержащее не более m ln n множеств. Обозначим через nt количество непокрытых элементов после t шагов. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 68. Алгоритм и анализ Алгоритм и анализ Алгоритм на каждом шаге выбирает множество, покрывающее маскимальное число все еще не покрытых элементов. Несложно построить пример, на котором такой жадный алгоритм выдает неоптимальное решение. Можно, однако, показать, что если оптимальное покрытие содержит m множеств, то наш жадный алгоритм найдет решение, содержащее не более m ln n множеств. Обозначим через nt количество непокрытых элементов после t шагов. Поскольку все эти элементы покрыватся m множествами из оптимального покрытия, найдется множество, покрывающее хотя бы nt /m из них. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 23 / 39
  • 69. Анализ Анализ А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 24 / 39
  • 70. Анализ Анализ Значит, жадная эвристика гарантирует, что (︂ )︂ nt 1 nt+1 ≤ nt − = nt 1 − . m m А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 24 / 39
  • 71. Анализ Анализ Значит, жадная эвристика гарантирует, что (︂ )︂ nt 1 nt+1 ≤ nt − = nt 1 − . m m Тогда (︂ )︂t 1 (︁ )︁t nt ≤ n0 1− < n0 e −1/m = ne −t/m . m А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 24 / 39
  • 72. Анализ Анализ Значит, жадная эвристика гарантирует, что (︂ )︂ nt 1 nt+1 ≤ nt − = nt 1 − . m m Тогда (︂ )︂t 1 (︁ )︁t nt ≤ n0 1− < n0 e −1/m = ne −t/m . m При t = m ln n, таким образом, nt будет строго меньше 1. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 24 / 39
  • 73. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 25 / 39
  • 74. Задача о вершинном покрытии Определение Задача о вершинном покрытии (vertex cover problem) заключается в нахождении по данному графу G = (V , E ) такого минимального его подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы одна из вершин u и v содержится в V ′ . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 26 / 39
  • 75. Задача о вершинном покрытии Определение Задача о вершинном покрытии (vertex cover problem) заключается в нахождении по данному графу G = (V , E ) такого минимального его подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы одна из вершин u и v содержится в V ′ . Простой жадный алгоритм А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 26 / 39
  • 76. Задача о вершинном покрытии Определение Задача о вершинном покрытии (vertex cover problem) заключается в нахождении по данному графу G = (V , E ) такого минимального его подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы одна из вершин u и v содержится в V ′ . Простой жадный алгоритм Рассмотрим следующий жадный алгоритм: на каждом шаге выбираем вершину максимальной степени и выкидываем из графа все покрытые ребра. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 26 / 39
  • 77. Задача о вершинном покрытии Определение Задача о вершинном покрытии (vertex cover problem) заключается в нахождении по данному графу G = (V , E ) такого минимального его подмножества вершин V ′ , что для любого ребра (u, v ) ∈ E хотя бы одна из вершин u и v содержится в V ′ . Простой жадный алгоритм Рассмотрим следующий жадный алгоритм: на каждом шаге выбираем вершину максимальной степени и выкидываем из графа все покрытые ребра. Мы покажем, что для любой константы c найдется граф, для которого этот алгоритм выдаст покрытие, которое по размеру будет более чем в c раз хуже оптимального. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 26 / 39
  • 78. Идея конструкции Идея конструкции А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 79. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 80. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 81. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 82. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 83. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi . Таким образом, deg(v ) = i для любой v ∈ Vi . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 84. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi . Таким образом, deg(v ) = i для любой v ∈ Vi . Ясно, что U является вершинным покрытием. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 85. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi . Таким образом, deg(v ) = i для любой v ∈ Vi . Ясно, что U является вершинным покрытием. Жадный же алгоритм может последовательно выбрать сначала все вершины из Vn , потом все вершины из Vn−1 и т.д. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 86. Идея конструкции Идея конструкции Рассматриваем двудольный граф на долях U и V . |U| = n!. V = V1 ∪ V2 ∪ · · · ∪ Vn , |Vi | = n!/i. Каждая вершина u ∈ U имеет ровно одного соседа в группе Vi . Таким образом, deg(v ) = i для любой v ∈ Vi . Ясно, что U является вершинным покрытием. Жадный же алгоритм может последовательно выбрать сначала все вершины из Vn , потом все вершины из Vn−1 и т.д. Полученное покрытие будет содержать n!(1/n + 1/(n − 1) + · · · + 1) вершин. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 27 / 39
  • 87. Пример для n = 6 А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 28 / 39
  • 88. План лекции 1 Введение Что такое жадный алгоритм? Пример: задача о выборе заявок Когда применимы жадные алгоритмы? 2 Коды Хаффмена 3 Покрытие множествами 4 Вершинное покрытие 5 Локальный поиск для SAT А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 29 / 39
  • 89. Формула в КНФ Определение А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 90. Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 91. Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). Литералом (literal) называется Булева переменная x или ее отрицание ¬x. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 92. Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). Литералом (literal) называется Булева переменная x или ее отрицание ¬x. Клозом (clause) называется дизъюнкция конечного множества литералов, не содержащего одновременно переменной и ее отрицания. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 93. Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). Литералом (literal) называется Булева переменная x или ее отрицание ¬x. Клозом (clause) называется дизъюнкция конечного множества литералов, не содержащего одновременно переменной и ее отрицания. k-клозом (k-clause) называется клоз, содержащий ровно k литералов. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 94. Формула в КНФ Определение Пропозициональной или Булевой (propositional, Boolean) переменной называется переменная, принимающая значения true (1) и false (0). Литералом (literal) называется Булева переменная x или ее отрицание ¬x. Клозом (clause) называется дизъюнкция конечного множества литералов, не содержащего одновременно переменной и ее отрицания. k-клозом (k-clause) называется клоз, содержащий ровно k литералов. Формулой в конъюнктивной нормальной форме (КНФ) (formula in conjunctive normal form, CNF) называется конъюнкция конечного множества клозов. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 30 / 39
  • 95. Задача выполнимости Определение Задача пропозициональной выполнимости (Boolean satisfiability problem, SAT): определить, выполнима ли данная формула в КНФ, то есть существует ли набор Булевых значений переменным формулы, выполняющий формулу. Такой набор называют выполняющим (satisfying assignment), а формулу, для которой такой набор существует, — выполнимой (satisfiable). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 31 / 39
  • 96. Задача выполнимости Определение Задача пропозициональной выполнимости (Boolean satisfiability problem, SAT): определить, выполнима ли данная формула в КНФ, то есть существует ли набор Булевых значений переменным формулы, выполняющий формулу. Такой набор называют выполняющим (satisfying assignment), а формулу, для которой такой набор существует, — выполнимой (satisfiable). Пример А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 31 / 39
  • 97. Задача выполнимости Определение Задача пропозициональной выполнимости (Boolean satisfiability problem, SAT): определить, выполнима ли данная формула в КНФ, то есть существует ли набор Булевых значений переменным формулы, выполняющий формулу. Такой набор называют выполняющим (satisfying assignment), а формулу, для которой такой набор существует, — выполнимой (satisfiable). Пример F1 = (x ∨ y ∨ ¬z) ∧ (¬x) ∧ (¬y ∨ z) F1 выполнима: x = 0, y = 1, z = 1 А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 31 / 39
  • 98. Задача выполнимости Определение Задача пропозициональной выполнимости (Boolean satisfiability problem, SAT): определить, выполнима ли данная формула в КНФ, то есть существует ли набор Булевых значений переменным формулы, выполняющий формулу. Такой набор называют выполняющим (satisfying assignment), а формулу, для которой такой набор существует, — выполнимой (satisfiable). Пример F1 = (x ∨ y ∨ ¬z) ∧ (¬x) ∧ (¬y ∨ z) F1 выполнима: x = 0, y = 1, z = 1 F2 = (x ∨ y ) ∧ (x ∨ ¬y ) ∧ (¬x ∨ y ) ∧ (¬x ∨ ¬y ) F2 невыполнима, но три клоза можно выполнить А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 31 / 39
  • 99. Жадный локальный поиск GSAT(F , maxflips, maxtries) 1 for i ← 1 to maxtries 2 do выбрать случайный набор I 3 for j ← 1 to maxflips 4 do если I выполняет F , вернуть I 5 выбрать переменную v , при изменении которой выполняется максимальное возможное количество клозов F 6 изменить значение переменной v в наборе I 7 return “не знаю” А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 32 / 39
  • 100. Сложная формула для алгоритма первый тип клозов (x1 ∨ ¬x2 ), (x2 ∨ ¬x3 ), . . . , (xn ∨ ¬x1 ) второй тип клозов (x1 ∨ x2 ) третий тип клозов (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn−2 ∨ ¬xn−1 ) (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn−1 ∨ ¬xn ) (x1 ∨ ¬x2 ∨ · · · ∨ ¬xn−3 ∨ ¬xn ∨ ¬xn−2 ) (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬xn−1 ∨ ¬xn ) (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬xn ∨ ¬x1 ) (x2 ∨ ¬x3 ∨ · · · ∨ ¬xn−2 ∨ ¬x1 ∨ ¬xn−1 ) ... (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−3 ∨ ¬xn−2 ) (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−2 ∨ ¬xn−1 ) (xn ∨ ¬x1 ∨ · · · ∨ ¬xn−4 ∨ ¬xn−1 ∨ ¬xn−3 ) А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 33 / 39
  • 101. Идеи доказательства Идеи доказательства А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 34 / 39
  • 102. Идеи доказательства Идеи доказательства Выполняющий набор у формулы всего один. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 34 / 39
  • 103. Идеи доказательства Идеи доказательства Выполняющий набор у формулы всего один. Если текущий набор алгоритма находится на расстоянии 2 от выполняющего, то следующим шагом алгоритм обязательно сделает неверный ход. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 34 / 39
  • 104. Идеи доказательства Идеи доказательства Выполняющий набор у формулы всего один. Если текущий набор алгоритма находится на расстоянии 2 от выполняющего, то следующим шагом алгоритм обязательно сделает неверный ход. Таким образом, если случайно выбранный набор не попадет в множество наборов, находящихся на расстоянии не более 1 от выполняющего, то жадный алгоритм за одно блуждание его не найдёт. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 34 / 39
  • 105. Идеи доказательства Идеи доказательства Выполняющий набор у формулы всего один. Если текущий набор алгоритма находится на расстоянии 2 от выполняющего, то следующим шагом алгоритм обязательно сделает неверный ход. Таким образом, если случайно выбранный набор не попадет в множество наборов, находящихся на расстоянии не более 1 от выполняющего, то жадный алгоритм за одно блуждание его не найдёт. Поскольку всего различных наборов 2n , а упомянутых — всего n + 1, жадный алгоритм находит выполняющий набор с экспоненциально маленькой вероятностью. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 34 / 39
  • 106. Формальное доказательство Теорема Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов, чем I . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 35 / 39
  • 107. Формальное доказательство Теорема Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов, чем I . Доказательство А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 35 / 39
  • 108. Формальное доказательство Теорема Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов, чем I . Доказательство Пусть I отличается от S значениями переменных v = xi и xj . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 35 / 39
  • 109. Формальное доказательство Теорема Пусть S = {x1 = 1, x2 = 1, . . . , xn = 1} — единственный выполняющий набор формулы F , I — набор, такой что d (S, I ) = 2. Тогда для любой переменной v , такой что d (S, I v ) = 1, I v выполняет меньше клозов, чем I . Доказательство Пусть I отличается от S значениями переменных v = xi и xj . Ясно, что I v выполняет клоз (x1 ∨ x2 ), 3n − 3 клоза третьего типа и n − 1 клозов первого типа. Всего 4n − 3 клоза, таким образом. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 35 / 39
  • 110. Формальное доказательство (продолжение) Доказательство А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 36 / 39
  • 111. Формальное доказательство (продолжение) Доказательство Рассмотрим три случая: А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 36 / 39
  • 112. Формальное доказательство (продолжение) Доказательство Рассмотрим три случая: 1 |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа, ̸ клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее 4n − 2. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 36 / 39
  • 113. Формальное доказательство (продолжение) Доказательство Рассмотрим три случая: 1 |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа, ̸ клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее 4n − 2. 2 |(i − j) (mod n)| = 1, но {i, j} = {1, 2}. Тогда n − 1 клоза первого ̸ типа, клоз (x1 ∨ x2 ) и 3n − 1 клозов третьего типа. Итого 4n − 1. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 36 / 39
  • 114. Формальное доказательство (продолжение) Доказательство Рассмотрим три случая: 1 |(i − j) (mod n)| = 1. Тогда I выполняет n − 2 клоза первого типа, ̸ клоз (x1 ∨ x2 ) и 3n − 1 или 3n клозов третьего типа. Всего не менее 4n − 2. 2 |(i − j) (mod n)| = 1, но {i, j} = {1, 2}. Тогда n − 1 клоза первого ̸ типа, клоз (x1 ∨ x2 ) и 3n − 1 клозов третьего типа. Итого 4n − 1. 3 {i, j} = {1, 2}. n − 1 клоз первого типа и 3n − 1 клоза третьего типа. 4n − 2 клоза. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 36 / 39
  • 115. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 116. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 117. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство Пусть I отличается от S значениями переменных xi и xj . А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 118. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство Пусть I отличается от S значениями переменных xi и xj . Выберем v так, чтобы А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 119. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство Пусть I отличается от S значениями переменных xi и xj . Выберем v так, чтобы 1 v ̸= x1 , x2 ; А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 120. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство Пусть I отличается от S значениями переменных xi и xj . Выберем v так, чтобы 1 v ̸= x1 , x2 ; 2 выполнено ровно одно из условий: v = xj+1 , v = xj−1 , v = xi+1 , , v = xi−1 (это возможно при n ≥ 6). А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 121. Завершающая теорема Теорема Пусть I — набор, такой что d (S, I ) = 2. Тогда найдется переменная v , такая что d (S, I v ) = 3 и I v выполняет столько же клозов, сколько и I . Доказательство Пусть I отличается от S значениями переменных xi и xj . Выберем v так, чтобы 1 v ̸= x1 , x2 ; 2 выполнено ровно одно из условий: v = xj+1 , v = xj−1 , v = xi+1 , , v = xi−1 (это возможно при n ≥ 6). Нетрудно видеть, что тогда I v выполняет те же клозы второго и третьего типов, что и I , и столько же клозов первого типа, что и I. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 37 / 39
  • 122. Что мы узнали за сегодня? Что мы узнали за сегодня? А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 38 / 39
  • 123. Что мы узнали за сегодня? Что мы узнали за сегодня? Две отличительные особенности жадного алгоритма: принцип жадного выбора и свойство оптимальности для подзадач. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 38 / 39
  • 124. Что мы узнали за сегодня? Что мы узнали за сегодня? Две отличительные особенности жадного алгоритма: принцип жадного выбора и свойство оптимальности для подзадач. Свойство оптимальности для подзадач выполняется и для динамического программирования. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 38 / 39
  • 125. Что мы узнали за сегодня? Что мы узнали за сегодня? Две отличительные особенности жадного алгоритма: принцип жадного выбора и свойство оптимальности для подзадач. Свойство оптимальности для подзадач выполняется и для динамического программирования. Жадная стратегия в ряде случае находит решение, которое не сильно хуже оптимального. А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 38 / 39
  • 126. Спасибо за внимание! А. Куликов (CS клуб при ПОМИ) 17. Жадные алгоритмы 39 / 39