Алгоритмы (Algorithms)
Алгоритмы — это пошаговые инструкции для решения задач. Они определяют, как обрабатывать данные для получения желаемого результата.
Что такое алгоритмы?
Алгоритм — это конечная последовательность четко определенных инструкций для решения задачи. Хороший алгоритм должен быть:
- Корректным — давать правильный результат
- Эффективным — использовать минимальные ресурсы
- Понятным — легко читаться и пониматься
Категории алгоритмов
Сортировка
Алгоритмы для упорядочивания данных по определенному критерию.
Основные алгоритмы сортировки:
- Сортировка — алгоритмы упорядочивания данных
Поиск
Алгоритмы для поиска элементов в структурах данных.
Основные алгоритмы поиска:
- Поиск — алгоритмы поиска элементов
Обход графов
Алгоритмы для исследования и обхода графовых структур.
Основные алгоритмы обхода:
- Обход графов — DFS, BFS и другие методы
Динамическое программирование
Решение задач через разбиение на подзадачи с запоминанием результатов.
Классические задачи:
- Динамическое программирование — решение задач через подзадачи
Жадные алгоритмы
Алгоритмы, которые делают локально оптимальный выбор на каждом шаге.
Основные жадные алгоритмы:
- Жадные алгоритмы — локально оптимальные решения
Разделяй и властвуй
Алгоритмы, которые разбивают задачу на подзадачи, решают их рекурсивно и объединяют результаты.
Основные алгоритмы:
- Разделяй и властвуй — разбиение задач на подзадачи
Анализ сложности
Временная сложность
- O(1) — константное время (доступ к элементу массива)
- O(log n) — логарифмическое время (бинарный поиск)
- O(n) — линейное время (линейный поиск)
- O(n log n) — квазилинейное время (эффективные сортировки)
- O(n²) — квадратичное время (простые сортировки)
- O(2ⁿ) — экспоненциальное время (перебор)
Пространственная сложность
- O(1) — константная память (in-place алгоритмы)
- O(n) — линейная память (массивы, стеки)
- O(log n) — логарифмическая память (рекурсия)
Примеры реализации
Быстрая сортировка
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(arr.length / 2)];
const left = arr.filter(x => x < pivot);
const middle = arr.filter(x => x === pivot);
const right = arr.filter(x => x > pivot);
return [...quickSort(left), ...middle, ...quickSort(right)];
}
Бинарный поиск
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
DFS (рекурсивный)
function dfs(graph, start, visited = new Set()) {
visited.add(start);
console.log(start);
for (const neighbor of graph[start]) {
if (!visited.has(neighbor)) {
dfs(graph, neighbor, visited);
}
}
}
Когда использовать какой алгоритм?
Сортировка
- Небольшие массивы (< 50 элементов): сортировка вставками
- Стабильность важна: сортировка слиянием
- Общий случай: быстрая сортировка
- Гарантированная производительность: сортировка кучей
Поиск
- Неотсортированные данные: линейный поиск
- Отсортированные данные: бинарный поиск
- Графы: DFS для исследования, BFS для кратчайшего пути
Оптимизация
- Перекрывающиеся подзадачи: динамическое программирование
- Жадный выбор работает: жадные алгоритмы
- Большие задачи: разделяй и властвуй
Преимущества изучения алгоритмов
- Развивает логическое мышление — учит разбивать сложные задачи
- Повышает эффективность кода — помогает выбирать оптимальные решения
- Готовит к собеседованиям — основа технических интервью
- Расширяет кругозор — знакомит с различными подходами к решению задач
Недостатки
- Требует практики — нужно много решать задач
- Абстрактные концепции — некоторые алгоритмы сложны для понимания
- Много деталей — нужно помнить особенности каждого алгоритма
Алгоритмы — это искусство решения задач эффективно!