
- •1. Вычислительные модели. Показатели эффективности алгоритмов, задача анализа алгоритмов. Время выполнения алгоритма для худшего и среднего случая. Вычислительные модели
- •Задача анализа алгоритмов
- •Время работы алгоритма
- •Время выполнения в худшем и среднем случае
- •5. Анализ рекурсивных алгоритмов. Анализ вставки элемента в бинарное дерево поиска.
- •5.Анализ сложности рекурсивных алгоритмов
- •6. Связные списки: однонаправленные, двунаправленные, кольцевые. Примеры реализации.
- •Однонаправленные (односвязные) списки
- •Двунаправленные (двусвязные) списки
- •7. Структура данных "стек". Реализация с помощью массива и связного списка, смешанная реализация. Пример использования (кроме задачи о скобках)
- •8.Структура данных "очередь". Реализация с помощью массива, циклического массива, односвязного списка.
- •Очереди
- •Бинарные деревья
- •11. Обходы бинарных деревьев (клп - "Корень-Левое-Правое" ,лкп,лпк) с примерами программной реализации.
- •12. Удаление элемента из бинарного дерева поиска.
- •13.Рандомизированные деревья. Вставка элемента в рандомизированное бинарное дерево поиска.
- •Включение элемента в рандомизированное дерево
- •Рекурсивный алгоритм вставки в рандомизированное дерево:
- •14.Быстрая сортировка Хоара (QuickSort)
- •Краткое описание алгоритма
- •Алгоритм
- •Оценка эффективности
- •15. Сортировка слиянием (MergeSort)
- •16.Полный перебор подмножеств
- •17. Полный перебор перестановок
- •18. Перебор с возвратом и отсечением вариантов
- •3.1 Использование рекурсии для записи алгоритма
- •3.2 Примеры решения задач при помощи перебора с возвратом
- •.1 Отсечение лишних вариантов
- •19. Динамическое программирование. Разбиение задачи на подзадачи, принцип оптимальности. Задача о маршруте из верхнего угла таблицы в нижний
- •20. Пример использования динамического программирования для подсчета количеств комбинаторных объектов - найти количество разбиений числа на слагаемые
- •21. Жадные алгоритмы. Принцип жадного выбора, свойство оптимальности для подзадач, схема доказательства корректности жадного алгоритма. Задача о заявках.
- •Принцип жадного выбора
- •Оптимальность для подзадач
- •Примеры Размен монет
- •Выбор заявок
- •22. Хеширование с цепочками. Эффективность хеширования с цепочками. Хеш-функции, качество хеш-функций, подходы к построению хеш-функций.
- •23. Хеширование с открытой адресацией. Способы разрешения коллизий. Анализ эффективности.
Оптимальность для подзадач
Говорят,
что задача обладает свойством
оптимальности
для подзадач,
если оптимальное решение задачи содержит
в себе оптимальные решения для всех её
подзадач. Например, в задаче о выборе
заявок можно заметить, что если
—
оптимальный набор заявок, содержащий
заявку номер 1, то
—
оптимальный набор заявок для меньшего
множества заявок
,
состоящего из тех заявок, для которых
.
Примеры Размен монет
Задача.
Монетная система некоторого государства
состоит из монет достоинством
.
Требуется выдать сумму
наименьшим
возможным количеством монет.
Жадный
алгоритм решения этой задачи таков.
Берётся наибольшее возможное количество
монет достоинства
:
.
Таким же образом получаем, сколько
нужно монет меньшего номинала, и т. д.
Для данной задачи жадный алгоритм не всегда даёт оптимальное решение. Например, сумму в 24 копейки монетами в 1, 5 и 7 коп. жадный алгоритм разменивает так: 7 коп. — 3 шт., 1 коп. — 3 шт., в то время как правильное решение — 7 коп. — 2 шт., 5 коп. — 2 шт. Тем не менее, на всех реальных монетных системах жадный алгоритм даёт правильный ответ.
Выбор заявок
Задача.
Даны
заявок
на проведение занятий в некоторой
аудитории. В каждой заявке указаны
начало и конец занятия (
и
для
-й
заявки). В случае пересечения заявок
можно удовлетворить лишь одну из них.
Заявки с номерами
и
совместны,
если интервалы
и
не
пересекаются (то есть
или
).
Задача о выборе заявок состоит в том,
чтобы набрать максимальное количество
совместных друг с другом заявок.
Формулировка № 2. На конференции, чтобы отвести больше времени на неформальное общение, различные секции разнесли по разным аудиториям. Учёный с чрезвычайно широкими интересами хочет посетить несколько докладов, проходящих в разных секциях. Известно начало и конец каждого доклада. Определить, какое максимальное количество докладов можно посетить.
Приведем
жадный алгоритм, решающий данную задачу.
При этом полагаем, что заявки упорядочены
в порядке возрастания времени окончания.
Если это не так, то можно отсортировать
их за время
;
заявки с одинаковым временем конца
располагаем в произвольном порядке.
Activity-Selector(s,f)
length[s]
for
to n
do if
then
∪
{i}