
- •Временная сложность алгоритмов
- •Задачи решимости, задачи оптимизации
- •Применение полного перебора для решения задачи коммивояжера. Перебор всех перестановок. Простой рекурсивный алгоритм
- •Применение полного перебора для решения задачи о рюкзаке. Перебор всех подмножеств множества. Сведение к перебору двоичных векторов. Коды Грея.
- •Общая схема метода ветвей и границ. Применение метода ветвей и границ для решения задачи о рюкзаке
- •Динамическое программирование
- •Жадные алгоритмы. Задача о выборе заявок. Свойства задач, для которых применимы жадные алгоритмы.
- •Эвристические методы решения задач. Эвристика жадного выбора и локального поиска. Примеры. Задача о покрытии, задача о камнях. Метаэвристики
- •Абстрактные типы данных. Атд стек, очередь, корневое дерево, множество, словарь, очередь с приоритетом, система непересекающихся множеств, граф и способы их реализации
- •Обходы графа. Поиск в глубину, поиск в ширину
Временная сложность алгоритмов
Временная сложность алгоритма описывает количество времени, необходимого для его выполнения в зависимости от размера входных данных. Обычно выражается с использованием символов O (big O), Θ (theta) и Ω (omega), которые представляют различные виды оценок временной сложности.
Определение: Основной показатель сложности – это время, необходимое для решения задачи и объём требуемой памяти.
Определение: Размер входа - некоторое число, характеризующее объём данных.
Определение: Порядок роста сложности (или аксиоматическая сложность) описывает приблизительное поведение функции сложности алгоритма при большом размере входа.
Определение: Шаг алгоритма – совокупность последовательно-расположенных элементарных операций, время выполнения которых не зависит от размера входа, то есть ограничена сверху некоторой константой.
Виды оценок:
O (big O) – оценка для худшего случая. Она же обозначает верхнюю границу временной сложности алгоритма. Определяет класс функций, которые растут не быстрее, чем g(n) с точностью до константного множителя.
Θ (theta) – оценка для среднего случая. Она же представляет среднюю временную сложность алгоритма. Он указывает на то, что время выполнения алгоритма является асимптотически точным и ограничивается сверху и снизу некоторой константой. Например, если алгоритм имеет временную сложность Θ(n^2), это означает, что время выполнения алгоритма квадратично зависит от размера входных данных.
Ω (omega) – оценка для лучшего случая. Она же обозначает нижнюю границу временной сложности алгоритма. Определяет класс функций, которые растут не медленнее, чем функция g(n) с точностью до константного множителя.
Критерии оценки сложности алгоритмов:
1) Равномерный весовой критерий (РВК) предполагает, что каждый шаг алгоритма выполняется за одну единицу времени, а ячейка памяти за одну единицу объёма (с точностью до константы). 2) Логарифмический весовой критерий (ЛВК) учитывает размер операнда, который обрабатывается той или иной операцией и значения, хранимого в ячейке памяти.
Примеры сложностей:
1) Линейная: O(n) Поиск максимального элемента в неотсортированном массиве путем прохода по всем элементам и сравнения их значения с текущим максимумом.
2) Квадратичная: O(n2) Сортировка выбором (selection sort), которая на каждой итерации находит минимальный элемент и помещает его в начало массива.
3) Логарифмическая: O(log n) Бинарный поиск в отсортированном массиве, который делит массив пополам на каждой итерации.
4) Константная: O(1) Получение элемента массива по его индексу, так как доступ к элементам массива выполняется непосредственно по индексу.
Определение: Полином (многочлен)
Pk(x) степени k есть выражение: Pk(x)
= ck xk + ck−1 xk−1 +
. . . + c1x + c0, где cj –
постоянные коэффициенты, j =
.
Определение: Алгоритм называется полиномиальным, если время его работы T(n) ограничено сверху некоторым полиномом: T(n) = O(Pk(n)) = O(nk).
Определение: Алгоритм называется экспоненциальным, если время его работы T(n) ограничено снизу показательной функцией: T(n) = Ω(an), где a > 1.