
- •1. Асимптотическая оценка алгоритма
- •2. Методика оценки не рекурсивных алгоритмов. Пример
- •3. Рекурсивные алгоритмы, построение асимптотической оценки. Пример
- •4. Методика оценки рекурсивных алгоритмов.
- •5. Алгоритмы сортировки массивов за полиномиальное время
- •6. Быстрые алгоритмы сортировки массивов, основанные на сравнении элементов
- •7. Алгоритмы сортировки массивов за линейное время
- •8. Линейные структуры данных, основные операции и характеристики
- •9. Деревья, виды, способы представления, структуры данных, обходы дерева
- •10. Двоичные деревья поиска, операции добавления элементов.
- •11. Двоичные деревья поиска, операции удаления элементов и поиска следующих
- •13. Двоичные кучи, основные операции и характеристики
- •16. Динамическое программирование, основные особенности
- •17. Жадные алгоритмы, основные особенности
- •18. Построение кода Хаффмена
- •19. Алгоритм обхода графов в ширину
- •20. Алгоритм обхода графов в глубину
- •21. Остовое дерево, классификация ребер, топологическая сортировка.
- •22. Сильно связные компоненты, алгоритм поиска
- •23. Построение минимально покрывающего дерева, алгоритм Крускала
- •24. Построение минимального покрывающего дерева, алгоритм Прима
- •25. Происк кратчайшего пути. Алгоритм Дейкстры
- •26. Поиск кратчайшего пути. Алгоритм Беллмана-Форда
16. Динамическое программирование, основные особенности
Динамическое программирование – метод решения класса задач, где общее решение задачи основано на решении подзадач меньшего размера. Подзадачи, на которые разбивается задача, являются пересекающимися.
Ключевая идея в динамическом программировании достаточно проста. Чтобы решить задачу, требуется решить отдельные части задачи (подзадачи), после чего объединить решения подзадач в одно общее решение. Часто многие из этих подзадач одинаковы. Подход динамического программирования состоит в том, чтобы решить каждую подзадачу только один раз, сократив тем самым количество вычислений. Это особенно полезно в случаях, когда число повторяющихся подзадач экспоненциально велико.
динамическое программирование пользуется следующими свойствами задачи:
перекрывающиеся подзадачи;
оптимальное решение задачи основано на оптимальном решении подзадач;
возможность запоминания решения полученных оптимальных решений.
Динамическое программирование обычно придерживается двух подходов к решению задач:
нисходящее динамическое программирование:
задача разбивается на подзадачи меньшего размера, они решаются и затем комбинируются для решения исходной задачи. Используется запоминание для решений часто встречающихся подзадач.
восходящее динамическое программирование:
все подзадачи, которые впоследствии понадобятся для решения исходной задачи просчитываются заранее и затем используются для построения решения исходной задачи.
Основные свойства задач динамического программирования:
Задача обладает свойством оптимальности
Небольшое число различных подзадач
Процесс разработки алгоритмов динамического программирования можно разбить на четыре этапа.
Описание структуры оптимального решения.
2. Рекурсивное определение значения, соответствующего оптимальному решению.
3. Вычисление значения, соответствующего оптимальному решению, с помощью метода восходящего анализа.
4. Составление оптимального решения на основе информации, полученной на предыдущих этапах.
17. Жадные алгоритмы, основные особенности
Жадные алгоритмы - производится локально оптимальный выбор в надежде, что он приведет к оптимальному решению всей задачи.
Динамическое программирование – разбить задачу на подзадачи и не вычислять подзадачи более одного раза (использовать память).
Жадный алгоритм — алгоритм, заключается в принятии оптимальных решений на каждом шаге, где общее решение задачи складывается из оптимальных решений на предыдущих шагах.
Для задач, решаемых жадными алгоритмами, характерны две особенности:
к ним применим Принцип жадного выбора,
они обладают свойством Оптимальности для подзадач.
Принцип жадного выбора
Говорят, что к оптимизационной задаче применим принцип жадного выбора, если последовательность локально оптимальных выборов даёт глобально оптимальное решение.
В типичном случае доказательство оптимальности следует такой схеме:
Доказывается, что жадный выбор на первом шаге не закрывает пути к оптимальному решению: для всякого решения есть другое, согласованное с жадным выбором и не хуже первого.
Показывается, что подзадача, возникающая после жадного выбора на первом шаге, аналогична исходной.
Рассуждение завершается по индукции.
Оптимальность для подзадач
Говорят, что задача обладает свойством оптимальности для подзадач, если оптимальное решение задачи содержит в себе оптимальные решения для всех её подзадач.