---
title: Алгоритмы
seo:
  description: >-
    Тема «Алгоритмы» для собеседования C++ Developer. Что такое алгоритмы
    сортировки и какие вы знаете? Какие алгоритмы работы со строками знаете?
  title: Алгоритмы — C++ Developer
---

[Все темы C++ Developer](/prep/c-developer)

Подтемы:

- [Алгоритмы · часть 1](#q-14bee738d69b810aba1adf780085bf88)
- [Алгоритмы · часть 2](#q-14bee738d69b81048fdec4d0ebd9282e)

## <strong>Что такое алгоритмы сортировки и какие вы знаете?</strong> [#q-14bee738d69b810aba1adf780085bf88]

Алгоритмы сортировки — это методы организации коллекций данных в упорядоченном порядке, обычно по возрастанию или убыванию. Они являются фундаментальными инструментами в информатике, применяемыми для обработки и управления данными. Вот несколько основных типов алгоритмов сортировки&#58;

1. <strong>Сортировка пузырьком</strong> <code>&#40;Bubble Sort&#41;</code>&#58;
   Простейший алгоритм, который повторно проходит через список, сравнивает
   соседние элементы и меняет их местами, если они находятся в неправильном
   порядке.

1. <strong>Сортировка вставками</strong> <code>&#40;Insertion Sort&#41;</code>
   &#58; Строит итоговый отсортированный массив (или список) одним элементом за
   раз, вставляя каждый новый элемент в уже отсортированную часть массива.

1. <strong>Сортировка выбором</strong> <code>&#40;Selection Sort&#41;</code>
   &#58; Находит минимальный элемент из неотсортированной части массива и
   помещает его в конец отсортированной части.

1. <strong>Быстрая сортировка</strong> <code>&#40;Quick Sort&#41;</code>&#58;
   Выбирает опорный элемент, и перегруппирует элементы вокруг него, так что
   элементы меньше опорного оказываются перед ним, а большие — после. Процесс
   повторяется рекурсивно для подмассивов до и после опорного элемента.

1. <strong>Сортировка слиянием</strong> <code>&#40;Merge Sort&#41;</code>&#58;
   Разделяет массив на две части, рекурсивно сортирует их, а затем сливает в
   один отсортированный массив.

1. <strong>Кучная сортировка</strong> <code>&#40;Heap Sort&#41;</code>&#58;
   Преобразует массив в двоичную кучу, затем извлекает элементы из кучи один за
   другим, восстанавливая свойства кучи после каждого извлечения.

1. <strong>Сортировка Шелла</strong> <code>&#40;Shell Sort&#41;</code>&#58;
   Улучшенная версия сортировки вставками, использует последовательность шагов
   (интервалов), сокращая количество перемещений элементов на большие
   расстояния.

1. <strong>Поразрядная сортировка</strong> <code>&#40;Radix Sort&#41;</code>
   &#58; Сортирует числа путем обработки отдельных цифр. Функционирует от
   младших разрядов к старшим или наоборот.

:::note[Ссылки для изучения]

1. [Сортировки SelectionSort и MergeSort: разделяй и властвуй](https://education.yandex.ru/handbook/algorithms/article/razdelyaj-i-vlastvuj)
2. [Алгоритмы сортировки. Alek OS, с 0:14](https://www.youtube.com/watch?v=PF7AqefS4MU&t=14s)

:::

---

## <strong>Какие алгоритмы работы со строками знаете?</strong> [#q-14bee738d69b81369498d0b3916abdd9]

Алгоритмы работы со строками — это методы обработки и анализа текстовых данных. Вот несколько основных алгоритмов, применяемых в обработке строк&#58;

{/* prettier-ignore */}
1. <strong>Поиск подстроки</strong>&#58;

    - <strong>Алгоритм Кнута-Морриса-Пратта</strong> <code>&#40;KMP&#41;</code>&#58; Эффективно ищет вхождения подстроки в строке, используя префиксную функцию для минимизации количества обратных шагов.

    - <strong>Алгоритм Бойера-Мура</strong>&#58; Использует суффиксные правила и информацию о встреченных символах для ускорения поиска подстроки.

    - <strong>Алгоритм Рабина-Карпа</strong>&#58; Использует хэш-функцию для быстрого сравнения подстрок, что позволяет эффективно искать множество шаблонов одновременно.

1. <strong>Сортировка строк</strong>&#58;

    - <strong>Поразрядная сортировка</strong> <code>&#40;Radix Sort&#41;</code>&#58; Особенно эффективна для сортировки строк, так как обрабатывает символы строк начиная с младших разрядов.

    - <strong>Сортировка слиянием</strong>&#58; Хорошо подходит для сортировки больших массивов строк из-за своей стабильности и эффективности на больших данных.

1. <strong>Динамическое программирование в строках</strong>&#58;

    - <strong>Расстояние Левенштейна</strong> <code>&#40;редакционное расстояние&#41;</code>&#58; Вычисляет минимальное количество операций вставки, удаления и замены, необходимых для преобразования одной строки в другую.

    - <strong>Нахождение наибольшей общей подпоследовательности</strong> <code>&#40;LCS&#41;</code>&#58; Определяет длину наибольшей последовательности символов, которая появляется в обеих строках в том же порядке.

1. <strong>Палиндромы</strong>&#58;

    - <strong>Алгоритмы для определения наибольшей палиндромической подстроки</strong>&#58; Используют различные методы, включая динамическое программирование и расширение вокруг центра, для нахождения самых длинных палиндромов в строке.

1. <strong>Парсинг и лексический анализ</strong>&#58;

    - <strong>Регулярные выражения</strong>&#58; Предоставляют мощные средства для поиска и извлечения данных из строк с помощью заданных паттернов.

:::note[Ссылки для изучения]

1. [Поиск подстроки КМП и префикс-функция на C++](https://habr.com/ru/articles/307220/)
   :::

---

## <strong>Какие алгоритмы на графах знаете?</strong> [#q-14bee738d69b81228769e99c68e7b458]

Алгоритмы на графах — это методы, используемые для анализа и решения задач в структурах данных, представляющих графы. Вот несколько ключевых алгоритмов, используемых для различных операций на графах&#58;

{/* prettier-ignore */}
1. <strong>Поиск в глубину</strong> <code>&#40;DFS&#44; Depth&#45;First Search&#41;</code>&#58;

    - Обходит граф, углубляясь как можно дальше, прежде чем отступать.

1. <strong>Поиск в ширину</strong> <code>&#40;BFS&#44; Breadth&#45;First Search&#41;</code>&#58;

    - Обходит граф по слоям, начиная с исходной вершины и распространяясь равномерно во все стороны.

1. <strong>Поиск кратчайшего пути</strong>&#58;

    - <strong>Алгоритм Дейкстры</strong>&#58; Находит кратчайшие пути от одной вершины до всех других в графе с неотрицательными весами рёбер.

    - <strong>Алгоритм Беллмана-Форда</strong>&#58; Решает ту же задачу, что и Дейкстра, но работает и с отрицательными весами рёбер.

    - <strong>Алгоритм Флойда-Уоршелла</strong>&#58; Находит кратчайшие пути между всеми парами вершин в графе.

1. <strong>Минимальное остовное дерево</strong> <code>&#40;Minimum Spanning Tree&#44; MST&#41;</code>&#58;

    - <strong>Алгоритм Прима</strong>&#58; Построение MST, начиная с выбранной вершины и добавляя к ней ближайшие вершины с минимальными весами рёбер.

    - <strong>Алгоритм Краскала</strong>&#58; Построение MST, выбирая рёбра с наименьшим весом, которые не образуют циклов.

1. <strong>Топологическая сортировка</strong>&#58;

    - Упорядочивает вершины так, чтобы для каждого направленного ребра из вершины U в вершину V, U шло перед V.

1. <strong>Сильно связные компоненты</strong>&#58;

    - <strong>Алгоритм Косарайю</strong>&#58; Находит сильно связные компоненты в направленном графе.

    - <strong>Алгоритм Тарьяна</strong>&#58; Эффективный способ нахождения сильно связных компонент с использованием одного <code>DFS</code> обхода.

1. <strong>Сети и потоки</strong>&#58;

    - <strong>Алгоритм Форда-Фалкерсона</strong>&#58; Расчёт максимального потока из источника в сток в сети.

    - <strong>Алгоритм Эдмондса-Карпа</strong>&#58; Реализация Форда-Фалкерсона с использованием <code>BFS</code> для нахождения увеличивающих путей.

:::note[Ссылки для изучения]

1. [Обходы графа: DFS и BFS](https://education.yandex.ru/handbook/algorithms/article/obhody-grafa)
   :::

---

## <strong>Какие алгоритмы применяли с</strong> <code>STL</code><strong>? В чем преимущество использования алгоритмов перед собственноручно написанными функциями?</strong> [#q-14bee738d69b81048fdec4d0ebd9282e]

<strong>Применяемые алгоритмы</strong> <code>STL</code>
<strong>&#58;</strong>

1. <code>std&#58;&#58;sort</code>&#58; Сортировка элементов.

1. <code>std&#58;&#58;find</code>&#58; Поиск элемента.

1. <code>std&#58;&#58;copy</code>&#58; Копирование элементов.

1. <code>std&#58;&#58;accumulate</code>&#58; Накопление значений (сумма).

1. <code>std&#58;&#58;transform</code>&#58; Преобразование элементов.

1. <code>std&#58;&#58;for&#95;each</code>&#58; Применение функции к каждому
   элементу.

<strong>Преимущества использования алгоритмов</strong> <code>STL</code>
<strong>&#58;</strong>

1. <strong>Оптимизация</strong>&#58; Алгоритмы <code>STL</code> тщательно
   оптимизированы и протестированы на производительность.

1. <strong>Безопасность</strong>&#58; Алгоритмы обеспечивают безопасное и
   правильное выполнение операций, минимизируя вероятность ошибок.

1. <strong>Универсальность</strong>&#58; <code>STL</code> алгоритмы могут
   работать с любыми контейнерами, поддерживающими соответствующие итераторы.

1. <strong>Читаемость и поддерживаемость</strong>&#58; Код с использованием
   <code>STL</code> алгоритмов обычно короче и легче читается, что упрощает его
   поддержку и развитие.

1. <strong>Совместимость</strong>&#58; Алгоритмы <code>STL</code> хорошо
   интегрированы с остальной частью стандартной библиотеки C++.

:::note[Ссылки для изучения]

1. [Основные понятия стандартной библиотеки C++](https://habr.com/ru/articles/434986/)
   :::

---

## <strong>Что такое сложность алгоритма и от чего она зависит?</strong> [#q-14bee738d69b8128bf03f1d231483f45]

Сложность алгоритма — это оценка ресурсов, необходимых для его выполнения, таких как время и память.

#### Виды сложности&#58;

1. <strong>Временная сложность</strong>&#58; Оценивает количество шагов или
   операций, необходимых для выполнения алгоритма.

1. <strong>Пространственная сложность</strong>&#58; Оценивает объем памяти,
   требуемый алгоритмом.

#### Зависит от&#58;

1. <strong>Размер входных данных</strong>&#58; Как изменяется количество шагов
   или используемой памяти в зависимости от размера входных данных.

1. <strong>Структура данных</strong>&#58; Выбор структуры данных может повлиять
   на сложность операций.

1. <strong>Тип операций</strong>&#58; Например, поиск, сортировка, вставка и
   удаление могут иметь разную сложность для различных алгоритмов.

Big O задаёт асимптотическую верхнюю границу выбранной функции затрат. Она может описывать худший, средний или амортизированный случай, который следует назвать отдельно. O(n) означает не более линейного роста с точностью до констант, а не обязательно точный линейный рост.

:::note[Ссылки для изучения]

1. [Алгоритмы и сложность: число операций и размер входа](https://education.yandex.ru/handbook/algorithms/article/algoritmy-i-slozhnost)
   :::
