- •1. Алгоритмическая сложность. Понятие алгоритма. Формы записи. Асимптотический анализ.
- •2. Алгоритмы поиска. Линейный и бинарный поиск
- •3. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Простой поиск.
- •4. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Алгоритм Рабина-Карпа.
- •5. Поиск подстроки в строке. Алгоритм Кнута-Мориса-Пратта
- •8. Линейные структуры данных. Списки. Связный и двусвязный списки.
- •9. Линейные структуры данных. Очереди. Кольцевые очереди. Стеки. Деки. Алгоритм сортировочной станции.
- •10. Ассоциативные массивы и хэш-таблицы.
- •11. Деревья. Дерево поиска и бинарное дерево поиска. Основные понятия
- •12. Сбалансированные деревья. Основные понятия. Малый и большой повороты дерева. Обходы дерева
- •13. Сбалансированные деревья. Авл-деревья. Алгоритм добавления нового узла
- •14. Сбалансированные деревья. Авл-деревья. Алгоритм удаления существующего узла
- •15. Сбалансированные деревья. Красно-чёрные деревья. Алгоритм добавления нового узла
- •Вставка
- •16. Сбалансированные деревья. Красно-чёрные деревья. Алгоритм удаления существующего узла
- •17. Сбалансированные деревья. B-деревья. 2-3-4 деревья. Основные понятия
- •Свойства
- •18. Сбалансированные деревья. 2-3-4 деревья. Алгоритм добавления нового ключа
- •19. Сбалансированные деревья. 2-3-4 деревья. Алгоритм удаления существующего узла
- •20. Сортировка сравнениями. Пузырьковая сортировка (bubble)
- •21. Сортировка сравнениями. Сортировка вставками (insertion)
- •22. Сортировка сравнениями. Селекционная сортировка (selection)
- •23. Сортировка «разделяй и властвуй». Сортировка слияниями (merge-sort)
- •24. Сортировка «разделяй и властвуй». Быстрая сортировка (quick-sort)
- •25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort)
- •26. Поразрядные, блочные сортировки и сортировка подсчётом.
- •28. Графы. Построение минимального остовного дерева. Алгоритм Прима
- •29. Графы. Построение минимального остовного дерева. Алгоритм Крускала
1. Алгоритмическая сложность. Понятие алгоритма. Формы записи. Асимптотический анализ.
Алгоритмическая (Вычислительная) сложность – это параметр для определения быстродействия алгоритмов, описывающий их поведение (время исполнения и объём необходимой памяти) в зависимости от размера входных данных.
Алгоритм — это корректно определенная вычислительная процедура, представляющая собой конечную последовательность действий.
Временная сложность алгоритма — это функция от размера входных данных, равная максимальному количеству элементарных операций, проделываемых алгоритмом для решения задачи указанного размера.
Оценка роста функции (оценка сложности) – это оценка алгоритма (по времени выполнения или по памяти) некоторой функцией от n (количество входной информации), характеризующего изменение времени работы алгоритма с увеличением параметра.
Оценка в среднем – это оценка работы алгоритма в среднем случае, когда невозможно посчитать работу алгоритма в лучшем и худшем случае (например для сортировки – частично отсортированная последовательность). Для выполнения подсчёта в среднем используется вероятностный анализ алгоритма. Суть которого заключается в определении всех вероятностей получить на вход какие-то входные значения заданного размера n, после чего рассчитывается математическое ожидание соответствующей случайной величины, как сумма произведения времени работы определённого набора величин на его вероятность.
Асимптотический анализ – представление о верхней и нижней границе целевой функции Т(n).
Рост целевой функции T(n) имеет различные названия:
Константное (время работы не зависит от n)
Логарифмическое (log n: двоичный поиск)
Линейное (n: поиск максимального значения)
Квазилинейное (n log n: большинство эффективных сортировок)
Квадратичное (n2: обход значений матрицы)
Полиномиальное (nc для c>1)
Экспоненциальное (cn для c>1)
Факториальное (n!: задача коммивояжёра)
Θ(g(n)) — асимптотически точная граница. Тогда для такой функции g(n) это обозначение будет означать множество таких функций, что:
Оценка сверху – это оценка работы алгоритма в худшем случае (например для сортировки – обратно сортированная последовательность).
Ο(g(n)) — асимптотически верхняя граница, для которой все функции будут находиться ниже. ТОЧНАЯ ВЕРХНЯЯ ГРАНИЦА
Оценка снизу – это оценка работы алгоритма в лучшем случае (например для сортировки – уже отсортированная последовательность).
Ω(g(n)) — асимптотически нижняя граница, для которой все функции будут находиться выше. ТОЧНАЯ НИЖНЯЯ ГРАНИЦА
2. Алгоритмы поиска. Линейный и бинарный поиск
Алгоритм поиска – последовательность операций сравнения, с искомым экземпляром данных, где очередные элементы в структуре данных (где выполняется поиск) выбираются, исходя от алгоритма поиска. Если после завершения алгоритма искомым экземпляром данных не был обнаружен в структуре данных, алгоритм завершает работу.
Линейный, последовательный поиск (сложность - О(n)) — алгоритм нахождения заданного значения в произвольной структуре данных. Данный алгоритм является простейшим алгоритмом поиска и работает за линейное время – с увеличением данных время выполнения увеличивается прямо-пропорционально. ''Метод поиска в лоб'' – перебирать все элементы в структуре данных начиная с первого (или с последнего) элемента и сравнить с искомым значением.
Двоичный (бинарный) поиск (сложность - О(log n)) – классический алгоритм поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. В каждой итерации работы алгоритма в массиве данных выбирается средний элемент и сравнивается с искомым элементом, исходя из того, будет элемент больше или меньше искомого, поиск продолжается в соответствующей половине.
