Алгоритм
Этот материал является определением понятия “алгоритм”, включая контрольные вопросы, ключевые моменты и теги.
В двух словах
Алгоритм это конечная, однозначно описанная последовательность действий для решения задачи. Оценивается по корректности, времени выполнения, потреблению памяти, устойчивости и надежности.
Краткое описание
Алгоритм обрабатывает четко определенные входные данные и выдает детерминированные или вероятностные результаты. Обычно описывается в псевдокоде с предусловиями и постусловиями.
Для анализа используют асимптотические обозначения:
- O (верхняя граница)
- Ω (нижняя граница)
- Θ (точная граница)
Часто разделяют по лучшему/среднему/худшему случаю и дополняют амортизированным анализом.
Типичные парадигмы проектирования:
- Divide and Conquer
- Greedy
- Динамическое программирование
- Backtracking
- Рандомизация
Выбор структур данных (массив, список, heap, hash-таблица, дерево, граф) сильно влияет на реальные затраты.
Вопрос безопасности: худшие входные данные могут вызвать Algorithmic Complexity Attacks, поэтому валидация входов и ограничение ресурсов имеют значение.
Ключевые моменты для экзамена
- Точный vs эвристический/приближенный; детерминированный vs рандомизированный
- O/Ω/Θ; лучший/средний/худший; амортизированный
- Парадигмы: D&C, Greedy, DP, Backtracking
- Предусловия/постусловия, завершаемость, инварианты циклов
- На практике: правильно выбрать структуру данных, сначала измерить потом оптимизировать
- Безопасность: защита от худшего случая, ограничения
- Документация: определение задачи, псевдокод, сложность, протоколы тестирования
Основные компоненты
- Спецификация (входные данные/выходные данные/ограничения)
- Модель затрат (время/память/I/O)
- Псевдокод (последовательность, выбор, цикл)
- Выбор структуры данных
- Корректность (инварианты/индукция/завершаемость)
- Анализ сложности
- Подход к проектированию
- Детали реализации (рекурсия/итерация)
- Надежность/безопасность
- Тестирование (граничные значения, fuzzing, регрессионные тесты)
Практический пример: Insertion Sort (псевдокод)
funktion insertionSort(a)
fuer i von 1 bis laenge(a)-1
key <- a[i]
j <- i-1
solange j >= 0 und a[j] > key
a[j+1] <- a[j]
j <- j-1
ende
a[j+1] <- key
ende
gib a zurueck
Пояснение: устойчив, работает на месте, худший случай O(n^2), лучший случай O(n) для почти отсортированных данных.
Типичные экзаменационные вопросы (с кратким ответом)
- O vs Ω vs Θ? O это верхняя граница, Ω это нижняя граница, Θ это точная граница.
- Когда Greedy дает правильный результат? Когда выполнены оптимальная подструктура и свойство выбора.
- Как узнать задачу на динамическое программирование? Пересекающиеся подзадачи плюс оптимальная подструктура.
- Как доказать завершаемость? Функция вариации, которая строго убывает и ограничена снизу.
Свободный ответ
Для экзаменационных задач важно: четко определить задачу, писать чистый псевдокод, обосновать сложность и тестировать граничные случаи. В реальных системах критичны эффекты кэша/I/O и защита от худшего сценария входных данных.
Стратегия обучения
- Напишите псевдокод и инварианты к старым задачам.
- Измерьте время выполнения (линейный vs двоичный поиск, разные сортировки).
- Смоделируйте пример DP (рюкзак) в виде таблицы.
- Всегда тестируйте граничные случаи и условия остановки.



