Практики разработки ПО → Алгоритмы и структуры данных → Основное
Основная идея
Алгоритм — это конечная последовательность чётко определённых инструкций для решения задачи или выполнения вычисления. Это «рецепт», который гарантированно приводит к результату за конечное число шагов.
Ключевые аспекты
Конечность — алгоритм должен завершаться за конечное число шагов
Определённость — каждый шаг должен быть однозначно понятен исполнителю
Входные данные — алгоритм получает ноль или более входных значений
Выходные данные — алгоритм выдаёт один или более результатов
Эффективность — каждая операция должна быть достаточно простой для выполнения
Плюсы использования алгоритмов
Структурированный подход к решению задач
Возможность анализа эффективности (время, память)
Повторяемость и предсказуемость результата
Независимость от языка программирования
Минусы
Не все задачи можно решить алгоритмически (проблема останова)
Разработка эффективного алгоритма требует времени
Оптимальный алгоритм может быть сложен для понимания
Частые ошибки на собеседованиях
Путают алгоритм и программу (программа — реализация алгоритма на конкретном языке)
Забывают про требование конечности — бесконечный цикл не является алгоритмом
Не учитывают граничные случаи при описании алгоритма
Введение и проблематика
В программировании мы постоянно решаем задачи: отсортировать список, найти элемент, обработать данные. Но как объяснить компьютеру, что именно нужно сделать? Для этого существуют алгоритмы.
Слово «алгоритм» происходит от имени персидского математика Мухаммеда аль-Хорезми (IX век), который описал правила выполнения арифметических операций.
Какую проблему решает понятие алгоритма?
Алгоритм позволяет:
Формализовать решение задачи в виде пошаговой инструкции
Передать это решение исполнителю (человеку или компьютеру)
Гарантировать получение результата при корректных входных данных
Базовая теория
Определение
Алгоритм — это конечная последовательность точно определённых инструкций, предназначенных для решения конкретной задачи или класса задач.
Свойства алгоритма
Любой алгоритм должен обладать пятью ключевыми свойствами:
Свойство
Описание
Пример нарушения
Конечность
Завершается за конечное число шагов
Бесконечный цикл while(true)
Определённость
Каждый шаг однозначен
«Добавить немного соли» — неоднозначно
Вход
Принимает входные данные (≥0)
—
Выход
Выдаёт результат (≥1)
Функция без return
Эффективность
Операции выполнимы за разумное время
Вычисление числа Грэма
⚠️
Бесконечный цикл — это не алгоритм, потому что нарушается свойство конечности.
Алгоритм vs Программа
graphLR A[Задача]--> B[Алгоритм] B --> C[Программа на Python] B --> D[Программа на JavaScript] B --> E[Программа на C++]
Алгоритм — абстрактное описание решения, независимое от языка
Программа — реализация алгоритма на конкретном языке программирования
Способы записи алгоритмов
Алгоритм можно представить разными способами:
text
Алгоритм поиска максимума в массиве:1. Взять первый элемент как текущий максимум2. Для каждого следующего элемента: - Если элемент больше текущего максимума, обновить максимум3. Вернуть максимум
Практические примеры
Пример 1: Алгоритм проверки чётности числа
Шаг 1: Получить число
Принять на вход целое число n.
Шаг 2: Проверить остаток от деления
Вычислить остаток от деления n на 2.
Шаг 3: Вернуть результат
Если остаток равен 0 — число чётное, иначе — нечётное.
js
functionisEven(n) {return n %2===0;}// Примеры использованияconsole.log(isEven(4)); // trueconsole.log(isEven(7)); // false
Пример 2: Алгоритм линейного поиска
js
functionlinearSearch(arr, target) {// Проходим по каждому элементу массиваfor (let i =0; i <arr.length; i++) {// Если нашли искомый элемент — возвращаем индексif (arr[i] === target) {return i; } }// Элемент не найденreturn-1;}constnumbers= [5,2,8,1,9];console.log(linearSearch(numbers,8)); // 2console.log(linearSearch(numbers,3)); // -1
Классификация алгоритмов
По структуре
Тип
Описание
Пример
Линейный
Шаги выполняются последовательно
Вычисление площади
Ветвящийся
Есть условия (if/else)
Проверка чётности
Циклический
Повторение действий
Поиск в массиве
Рекурсивный
Вызывает сам себя
Вычисление факториала
По назначению
Сортировка: bubble sort, quick sort, merge sort
Поиск: линейный, бинарный
Обход графов: BFS, DFS
Строковые: поиск подстроки, сравнение
Пограничные кейсы
⚠️
При разработке алгоритма всегда учитывайте граничные случаи!
Типичные граничные случаи:
Пустой массив — что вернёт алгоритм поиска максимума?
Один элемент — корректно ли обрабатывается?
Отрицательные числа — учтены ли в логике?
Дубликаты — как алгоритм работает с повторяющимися значениями?
js
functionfindMax(arr) {// Обработка граничного случаяif (arr.length===0) {returnundefined; // или throw new Error('Массив пуст') }let max = arr[0];for (let i =1; i <arr.length; i++) {if (arr[i] > max) { max = arr[i]; } }return max;}
Плюсы и минусы
Преимущества алгоритмического мышления
Структурированность — задача разбивается на понятные шаги
Повторяемость — одинаковый вход даёт одинаковый выход
Анализируемость — можно оценить сложность и эффективность
Универсальность — алгоритм не привязан к языку программирования
Ограничения
Не всё алгоритмизируемо — существуют неразрешимые задачи
Компромиссы — часто приходится выбирать между временем и памятью
Сложность разработки — оптимальный алгоритм не всегда очевиден
Вопросы интервьюера
Q: Чем алгоритм отличается от программы?
Алгоритм — это абстрактное описание последовательности действий, независимое от языка программирования. Программа — конкретная реализация алгоритма на определённом языке.
Q: Какие свойства должен иметь алгоритм?
Конечность, определённость, наличие входа и выхода, эффективность.
Q: Приведите пример задачи, которую нельзя решить алгоритмически?
Проблема останова (halting problem) — невозможно создать алгоритм, который определит, остановится ли произвольная программа.
Q: Что такое сложность алгоритма?
Это мера ресурсов (времени или памяти), необходимых для выполнения алгоритма в зависимости от размера входных данных. Обычно выражается через O-нотацию.