SlideShare a Scribd company logo
1 of 23
Анализ комбинаторных
алгоритмов
Лекция №9
Жадные алгоритмы
Жадные алгоритмы
 Для многих оптимизационных задач можно
предложить более простые и быстрые
алгоритмы, чем построенные с использованием
динамического программирования.
 Жадный алгоритм – это алгоритм, делающий на
каждом шаге локально оптимальный выбор, в
расчете на то, что итоговое решение тоже
окажется оптимальным.
Задача о выборе заявок
 Пусть даны n заявок на проведение занятий в
аудитории.
 Два разных занятия в аудитории не могут
перекрываться во времени.
 В каждой заявке указаны время начала и время
конца занятия (s и f ).
 Разные заявки могут перекрываться и тогда
можно удовлетворить только одну из них.
Задача о выборе заявок
 Заявки i и j совместны, если интервалы [si,fi) и
[sj,fj) не пересекаются (fi <= sjили fj <= si).
 Задача о выборе заявок состоит в том, чтобы
набрать максимальное количество совместных
друг с другом заявок.
Задача о выборе заявок
Жадный алгоритм работает в два этапа:
 Сортирует заявки по возрастанию времени
окончания занятия.
 Выбирает первую заявку. После этого
выбирает первую совместную с выбранной на
предыдущем шаге заявку.
Задача о выборе заявок
void GreedyActivitySelector(s,f){
n = length(s);
A->Add(1);
j = 1;
for (i=2; i<=n; i++) {
if (s[i]>=f[j]){
A->Add(i);
j = i;
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12
1
2
3
5
4
6
7
8
Задача о выборе заявок
Теорема.
В задаче выбора заявок жадный алгоритм дает
оптимальное решение.
Жадный алгоритм дает оптимальное решение
не для всех задач.
Применимость жадных алгоритмов
Существуют две особенности, характерные для
задач, решаемых жадными алгоритмами:
 Принцип жадного выбора. Говорят, что к задаче
применим принцип жадного выбора, если
последовательность локально оптимальных
(жадных) выборов дает глобально оптимальное
решение. Применимость принципа жадного выбора
доказывается для каждой задачи отдельно.
 Принцип оптимальности для подзадач.
Оптимальное решение задачи содержит в себе
оптимальные решения подзадач.
Применимость жадных алгоритмов
 И жадные алгоритмы и динамическое
программирование основываются на свойстве
оптимальности для подзадач.
 Можно легко допустить ошибку выбрав
динамическое программирование для
реализации задачи, в которой бы хватило
жадного алгоритма, или реализовав жадный
алгоритм для задачи, в которой он не дает
оптимального решения.
Применимость жадных алгоритмов
Дискретная задача о рюкзаке
Пусть вор пробрался на склад, на котором хранится n
вещей. Вещь с номером I стоит v рублей весит w
килограмм. Максимальный вес, который он может унести,
равен W. Вещи ломать и дробить нельзя. Какие вещи
должен положить в рюкзак вор, чтобы получить больше
денег?
Непрерывная задача о рюкзаке.
Отличается от дискретной тем, что вор может дробить
вещи и от этого они своей ценности не теряют.
Применимость жадных алгоритмов
 Обе задачи обладают свойством оптимальности
для подзадач. Вынув вещь j из оптимально
загруженного рюкзака, получим решение для
подзадачи с максимальным весом W- wj и
набором из n-1 вещей. Аналогично для
непрерывной задачи.
 Жадный алгоритм дает оптимальное решение
для непрерывной задачи, но не дает для
дискретной.
Применимость жадных алгоритмов
5 кг
10 кг
7 кг
Непрерывная задача
30 $/кг
20 $/кг
10 $/кг
5
10
17
10
20
30
6 $/кг 5 $/кг 4 $/кг
50
10
20
20
$160 $220
30
Дискретная задача
Коды Хаффмана
 Для сжатия информации широко используются
коды Хаффмана.
 Степень сжатия информации с помощью кода
Хаффмана составляет 20 - 90%, в зависимости
от типа сжимаемой информации.
 Алгоритм Хаффмана находит оптимальные
коды символов (исходя из частоты их
использования в тексте) с помощью жадного
выбора.
Коды Хаффмана
 Пусть в файле известны частоты символов.
 Каждый символ может быть представлен
двоичным кодом (конечной последовательностью
бит, называемых словом).
 При использовании равномерного кода на каждый
символ будет тратиться одинаковое количество
бит.
 Неравномерный код будет эффективнее
равномерного, если часто встречающиеся символы
заменить короткими последовательностями бит, а
редко встречающиеся – длинными.
Коды Хаффмана
a b c d e f
Частоты в тыс. 45 13 12 16 9 5
Равномерный код 000 001 010 011 100 101
Неравномерный
код
0 101 100 111 1101 1100
Для файла из 100 000 символов размер будет составлять:
При равномерном кодировании: 100 000 * 3 = 300 000
При неравномерном кодировании:
(45*1+13*3+12*3+16*3+9*4+5*4)*1000 = 224 000
Коды Хаффмана
0 1
0 1 0
a b c d e f
0 0 01 1
1
0 1
1
10a
e
d
f
c b
0
0
11
0
Коды Хаффмана
 Для того чтобы декодирование неравномерного
кода можно было однозначно осуществить слева
направо, код должен быть префиксным.
 В префиксном коде ни одна из последователь-
ностей бит, представляющих символы не является
префиксом другой.
 Для эффективной реализации декодирования
можно представить код в виде двоичного дерева,
листьями которого являются символы.
 Оптимальный код будет представлен деревом, у
которого каждая вершина (кроме листьев) имеет
двух детей.
Коды Хаффмана
 Хаффман построил жадный алгоритм
строящий оптимальный префиксный код (код
Хаффмана).
 Алгоритм строит двоичное дерево кода, снизу
вверх, начиная с листьев и делая n-1
«слияний».
 В результате слияния получается внутренняя
вершина, частота которой равна сумме частот
сливаемых объектов.
Коды Хаффмана
f:5 e:9 c:12 b:13 d:16 a:45
f:5 e:9
c:12 b:13 d:16 a:4514
Шаг 1
Шаг 2
Коды Хаффмана
f:5 e:9 c:12 b:13
d:16 a:4514
Шаг 3
25
f:5 e:9
c:12 b:13 d:16
a:45
14
Шаг 4
25 30
Коды Хаффмана
f:5 e:9
c:12 b:13 d:16
a:45
14
Шаг 5
25 30
55
Коды Хаффмана
f:5 e:9
c:12 b:13 d:16
a:45
14
Шаг 6
25 30
55
100
0 1
0
0 0
0
1
1
1
Коды Хаффмана
void Huffman(C){
n = length(C);
Q->Create(C);
for (i=1; i<n; i++) {
z = new NODE;
x = Q->ExtractMin();
y = Q->ExtractMin();
z->left = x;
z->right = y;
z->freq = x->freq + y->freq;
Q->Insert(z);
}
return Q->ExtractMin();
}

More Related Content

What's hot

Розв'язування вправ на знаходження похідної функції
Розв'язування вправ на знаходження похідної функціїРозв'язування вправ на знаходження похідної функції
Розв'язування вправ на знаходження похідної функціїAnetico
 
Проблеми мотивації персоналу підприємств в умовах кризи
Проблеми мотивації персоналу підприємств в умовах кризиПроблеми мотивації персоналу підприємств в умовах кризи
Проблеми мотивації персоналу підприємств в умовах кризиAlex Grebeshkov
 
лекція 4.числові ряди.збіжність ряду
лекція 4.числові ряди.збіжність рядулекція 4.числові ряди.збіжність ряду
лекція 4.числові ряди.збіжність рядуcit-cit
 
мпр т 5
мпр т 5мпр т 5
мпр т 5Ivan
 
Презентація:Додавання натуральних чисел
Презентація:Додавання натуральних чиселПрезентація:Додавання натуральних чисел
Презентація:Додавання натуральних чиселsveta7940
 
лекція 5. знакозмінні ряди
лекція 5. знакозмінні рядилекція 5. знакозмінні ряди
лекція 5. знакозмінні рядиcit-cit
 
Презентація до уроку"Залежність опору від температури. Надпровідність".
Презентація до уроку"Залежність опору від температури. Надпровідність".Презентація до уроку"Залежність опору від температури. Надпровідність".
Презентація до уроку"Залежність опору від температури. Надпровідність".natalishodinki
 
тотожні перетворення виразів, які містять квадратні корені
тотожні перетворення виразів, які містять квадратні коренітотожні перетворення виразів, які містять квадратні корені
тотожні перетворення виразів, які містять квадратні кореніГергель Ольга
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
множення звичайних дробів
множення звичайних дробівмноження звичайних дробів
множення звичайних дробівjenny_lion89
 
геометричний та фізичний зміст похідної.
геометричний та фізичний зміст похідної.геометричний та фізичний зміст похідної.
геометричний та фізичний зміст похідної.yahnoluida
 
практ.зан. 1. степеневі ряди
практ.зан. 1.  степеневі рядипракт.зан. 1.  степеневі ряди
практ.зан. 1. степеневі рядиcit-cit
 
скласти формули бінарних сполук за відомими валентностями
скласти формули бінарних сполук за відомими валентностямискласти формули бінарних сполук за відомими валентностями
скласти формули бінарних сполук за відомими валентностямиoksanachernish
 
Відношення. Основна властивість відношення.
Відношення. Основна властивість відношення.Відношення. Основна властивість відношення.
Відношення. Основна властивість відношення.ljudaljudaljudaa
 
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.VsimPPT
 
Одномембранні органели
Одномембранні органелиОдномембранні органели
Одномембранні органелиlabinskiir-33
 
8 клас раціональні дроби.
8 клас раціональні дроби.8 клас раціональні дроби.
8 клас раціональні дроби.Alexandra Gartfil
 
Reinforcement learning
Reinforcement learningReinforcement learning
Reinforcement learningDongHyun Kwak
 

What's hot (20)

Розв'язування вправ на знаходження похідної функції
Розв'язування вправ на знаходження похідної функціїРозв'язування вправ на знаходження похідної функції
Розв'язування вправ на знаходження похідної функції
 
функції
функціїфункції
функції
 
Проблеми мотивації персоналу підприємств в умовах кризи
Проблеми мотивації персоналу підприємств в умовах кризиПроблеми мотивації персоналу підприємств в умовах кризи
Проблеми мотивації персоналу підприємств в умовах кризи
 
лекція 4.числові ряди.збіжність ряду
лекція 4.числові ряди.збіжність рядулекція 4.числові ряди.збіжність ряду
лекція 4.числові ряди.збіжність ряду
 
мпр т 5
мпр т 5мпр т 5
мпр т 5
 
Презентація:Додавання натуральних чисел
Презентація:Додавання натуральних чиселПрезентація:Додавання натуральних чисел
Презентація:Додавання натуральних чисел
 
лекція 5. знакозмінні ряди
лекція 5. знакозмінні рядилекція 5. знакозмінні ряди
лекція 5. знакозмінні ряди
 
Презентація до уроку"Залежність опору від температури. Надпровідність".
Презентація до уроку"Залежність опору від температури. Надпровідність".Презентація до уроку"Залежність опору від температури. Надпровідність".
Презентація до уроку"Залежність опору від температури. Надпровідність".
 
тотожні перетворення виразів, які містять квадратні корені
тотожні перетворення виразів, які містять квадратні коренітотожні перетворення виразів, які містять квадратні корені
тотожні перетворення виразів, які містять квадратні корені
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
множення звичайних дробів
множення звичайних дробівмноження звичайних дробів
множення звичайних дробів
 
геометричний та фізичний зміст похідної.
геометричний та фізичний зміст похідної.геометричний та фізичний зміст похідної.
геометричний та фізичний зміст похідної.
 
практ.зан. 1. степеневі ряди
практ.зан. 1.  степеневі рядипракт.зан. 1.  степеневі ряди
практ.зан. 1. степеневі ряди
 
скласти формули бінарних сполук за відомими валентностями
скласти формули бінарних сполук за відомими валентностямискласти формули бінарних сполук за відомими валентностями
скласти формули бінарних сполук за відомими валентностями
 
Відношення. Основна властивість відношення.
Відношення. Основна властивість відношення.Відношення. Основна властивість відношення.
Відношення. Основна властивість відношення.
 
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.
Урок 34 для 6 класу - Розробка сценарію майбутнього програмного проекту.
 
Одномембранні органели
Одномембранні органелиОдномембранні органели
Одномембранні органели
 
8 клас раціональні дроби.
8 клас раціональні дроби.8 клас раціональні дроби.
8 клас раціональні дроби.
 
Fuzzy logic
Fuzzy logicFuzzy logic
Fuzzy logic
 
Reinforcement learning
Reinforcement learningReinforcement learning
Reinforcement learning
 

Viewers also liked

Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4simple_people
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1simple_people
 
Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1simple_people
 
Лекция 10 NP-полнота
Лекция 10 NP-полнотаЛекция 10 NP-полнота
Лекция 10 NP-полнотаsimple_people
 
Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2simple_people
 
Лекция 15 Поиск подстрок
Лекция 15 Поиск подстрокЛекция 15 Поиск подстрок
Лекция 15 Поиск подстрокsimple_people
 
Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3simple_people
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийsimple_people
 
Мобильные Сервисные Службы
Мобильные Сервисные СлужбыМобильные Сервисные Службы
Мобильные Сервисные Службыsimple_people
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
Лекция 8 Динамическое программирование
Лекция 8 Динамическое программированиеЛекция 8 Динамическое программирование
Лекция 8 Динамическое программированиеsimple_people
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиsimple_people
 

Viewers also liked (12)

Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 
Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1
 
Лекция 10 NP-полнота
Лекция 10 NP-полнотаЛекция 10 NP-полнота
Лекция 10 NP-полнота
 
Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2Лекция 4 Элементарные структуры данных часть 2
Лекция 4 Элементарные структуры данных часть 2
 
Лекция 15 Поиск подстрок
Лекция 15 Поиск подстрокЛекция 15 Поиск подстрок
Лекция 15 Поиск подстрок
 
Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3Лекция 5 Элементарные структуры данных часть 3
Лекция 5 Элементарные структуры данных часть 3
 
Лекция 1 Скорость роста функций
Лекция 1 Скорость роста функцийЛекция 1 Скорость роста функций
Лекция 1 Скорость роста функций
 
Мобильные Сервисные Службы
Мобильные Сервисные СлужбыМобильные Сервисные Службы
Мобильные Сервисные Службы
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
Лекция 8 Динамическое программирование
Лекция 8 Динамическое программированиеЛекция 8 Динамическое программирование
Лекция 8 Динамическое программирование
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистики
 

Similar to Лекция 9 Жадные алгоритмы

практика 7
практика 7практика 7
практика 7student_kai
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
 
Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterRoman Nevolin
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Mikhail Kurnosov
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыEvgeny Smirnov
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
20080316 efficientalgorithms kulikov_lecture17
20080316 efficientalgorithms kulikov_lecture1720080316 efficientalgorithms kulikov_lecture17
20080316 efficientalgorithms kulikov_lecture17Computer Science Club
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Platonov Sergey
 
Что такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tЧто такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tTatyanazaxarova
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rusGarrikus
 
основы алгоритмизации
основы алгоритмизацииосновы алгоритмизации
основы алгоритмизацииRania Fazliachmetova
 

Similar to Лекция 9 Жадные алгоритмы (19)

практика 7
практика 7практика 7
практика 7
 
алгоритм
алгоритмалгоритм
алгоритм
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
 
пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
 
Машинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 PiterМашинное обучение на платформе .NET - DotNext 2016 Piter
Машинное обучение на платформе .NET - DotNext 2016 Piter
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей.
 
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
Лекция 12: Методы разработки алгоритмов. Динамическое программирование. Жадны...
 
алгоритм
алгоритмалгоритм
алгоритм
 
Алгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмыАлгоритмы на ruby: жадные алгоритмы
Алгоритмы на ruby: жадные алгоритмы
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
20080316 efficientalgorithms kulikov_lecture17
20080316 efficientalgorithms kulikov_lecture1720080316 efficientalgorithms kulikov_lecture17
20080316 efficientalgorithms kulikov_lecture17
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
 
Что такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_tЧто такое size_t и ptrdiff_t
Что такое size_t и ptrdiff_t
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выражения
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rus
 
85004
8500485004
85004
 
основы алгоритмизации
основы алгоритмизацииосновы алгоритмизации
основы алгоритмизации
 

Лекция 9 Жадные алгоритмы

  • 2. Жадные алгоритмы  Для многих оптимизационных задач можно предложить более простые и быстрые алгоритмы, чем построенные с использованием динамического программирования.  Жадный алгоритм – это алгоритм, делающий на каждом шаге локально оптимальный выбор, в расчете на то, что итоговое решение тоже окажется оптимальным.
  • 3. Задача о выборе заявок  Пусть даны n заявок на проведение занятий в аудитории.  Два разных занятия в аудитории не могут перекрываться во времени.  В каждой заявке указаны время начала и время конца занятия (s и f ).  Разные заявки могут перекрываться и тогда можно удовлетворить только одну из них.
  • 4. Задача о выборе заявок  Заявки i и j совместны, если интервалы [si,fi) и [sj,fj) не пересекаются (fi <= sjили fj <= si).  Задача о выборе заявок состоит в том, чтобы набрать максимальное количество совместных друг с другом заявок.
  • 5. Задача о выборе заявок Жадный алгоритм работает в два этапа:  Сортирует заявки по возрастанию времени окончания занятия.  Выбирает первую заявку. После этого выбирает первую совместную с выбранной на предыдущем шаге заявку.
  • 6. Задача о выборе заявок void GreedyActivitySelector(s,f){ n = length(s); A->Add(1); j = 1; for (i=2; i<=n; i++) { if (s[i]>=f[j]){ A->Add(i); j = i; } } } 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 5 4 6 7 8
  • 7. Задача о выборе заявок Теорема. В задаче выбора заявок жадный алгоритм дает оптимальное решение. Жадный алгоритм дает оптимальное решение не для всех задач.
  • 8. Применимость жадных алгоритмов Существуют две особенности, характерные для задач, решаемых жадными алгоритмами:  Принцип жадного выбора. Говорят, что к задаче применим принцип жадного выбора, если последовательность локально оптимальных (жадных) выборов дает глобально оптимальное решение. Применимость принципа жадного выбора доказывается для каждой задачи отдельно.  Принцип оптимальности для подзадач. Оптимальное решение задачи содержит в себе оптимальные решения подзадач.
  • 9. Применимость жадных алгоритмов  И жадные алгоритмы и динамическое программирование основываются на свойстве оптимальности для подзадач.  Можно легко допустить ошибку выбрав динамическое программирование для реализации задачи, в которой бы хватило жадного алгоритма, или реализовав жадный алгоритм для задачи, в которой он не дает оптимального решения.
  • 10. Применимость жадных алгоритмов Дискретная задача о рюкзаке Пусть вор пробрался на склад, на котором хранится n вещей. Вещь с номером I стоит v рублей весит w килограмм. Максимальный вес, который он может унести, равен W. Вещи ломать и дробить нельзя. Какие вещи должен положить в рюкзак вор, чтобы получить больше денег? Непрерывная задача о рюкзаке. Отличается от дискретной тем, что вор может дробить вещи и от этого они своей ценности не теряют.
  • 11. Применимость жадных алгоритмов  Обе задачи обладают свойством оптимальности для подзадач. Вынув вещь j из оптимально загруженного рюкзака, получим решение для подзадачи с максимальным весом W- wj и набором из n-1 вещей. Аналогично для непрерывной задачи.  Жадный алгоритм дает оптимальное решение для непрерывной задачи, но не дает для дискретной.
  • 12. Применимость жадных алгоритмов 5 кг 10 кг 7 кг Непрерывная задача 30 $/кг 20 $/кг 10 $/кг 5 10 17 10 20 30 6 $/кг 5 $/кг 4 $/кг 50 10 20 20 $160 $220 30 Дискретная задача
  • 13. Коды Хаффмана  Для сжатия информации широко используются коды Хаффмана.  Степень сжатия информации с помощью кода Хаффмана составляет 20 - 90%, в зависимости от типа сжимаемой информации.  Алгоритм Хаффмана находит оптимальные коды символов (исходя из частоты их использования в тексте) с помощью жадного выбора.
  • 14. Коды Хаффмана  Пусть в файле известны частоты символов.  Каждый символ может быть представлен двоичным кодом (конечной последовательностью бит, называемых словом).  При использовании равномерного кода на каждый символ будет тратиться одинаковое количество бит.  Неравномерный код будет эффективнее равномерного, если часто встречающиеся символы заменить короткими последовательностями бит, а редко встречающиеся – длинными.
  • 15. Коды Хаффмана a b c d e f Частоты в тыс. 45 13 12 16 9 5 Равномерный код 000 001 010 011 100 101 Неравномерный код 0 101 100 111 1101 1100 Для файла из 100 000 символов размер будет составлять: При равномерном кодировании: 100 000 * 3 = 300 000 При неравномерном кодировании: (45*1+13*3+12*3+16*3+9*4+5*4)*1000 = 224 000
  • 16. Коды Хаффмана 0 1 0 1 0 a b c d e f 0 0 01 1 1 0 1 1 10a e d f c b 0 0 11 0
  • 17. Коды Хаффмана  Для того чтобы декодирование неравномерного кода можно было однозначно осуществить слева направо, код должен быть префиксным.  В префиксном коде ни одна из последователь- ностей бит, представляющих символы не является префиксом другой.  Для эффективной реализации декодирования можно представить код в виде двоичного дерева, листьями которого являются символы.  Оптимальный код будет представлен деревом, у которого каждая вершина (кроме листьев) имеет двух детей.
  • 18. Коды Хаффмана  Хаффман построил жадный алгоритм строящий оптимальный префиксный код (код Хаффмана).  Алгоритм строит двоичное дерево кода, снизу вверх, начиная с листьев и делая n-1 «слияний».  В результате слияния получается внутренняя вершина, частота которой равна сумме частот сливаемых объектов.
  • 19. Коды Хаффмана f:5 e:9 c:12 b:13 d:16 a:45 f:5 e:9 c:12 b:13 d:16 a:4514 Шаг 1 Шаг 2
  • 20. Коды Хаффмана f:5 e:9 c:12 b:13 d:16 a:4514 Шаг 3 25 f:5 e:9 c:12 b:13 d:16 a:45 14 Шаг 4 25 30
  • 21. Коды Хаффмана f:5 e:9 c:12 b:13 d:16 a:45 14 Шаг 5 25 30 55
  • 22. Коды Хаффмана f:5 e:9 c:12 b:13 d:16 a:45 14 Шаг 6 25 30 55 100 0 1 0 0 0 0 1 1 1
  • 23. Коды Хаффмана void Huffman(C){ n = length(C); Q->Create(C); for (i=1; i<n; i++) { z = new NODE; x = Q->ExtractMin(); y = Q->ExtractMin(); z->left = x; z->right = y; z->freq = x->freq + y->freq; Q->Insert(z); } return Q->ExtractMin(); }