Перейти к содержимому
На этой странице

Алгоритмы

Все темы C++ Developer

Подтемы:

Что такое алгоритмы сортировки и какие вы знаете?

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

  1. Сортировка пузырьком (Bubble Sort): Простейший алгоритм, который повторно проходит через список, сравнивает соседние элементы и меняет их местами, если они находятся в неправильном порядке.

  2. Сортировка вставками (Insertion Sort) : Строит итоговый отсортированный массив (или список) одним элементом за раз, вставляя каждый новый элемент в уже отсортированную часть массива.

  3. Сортировка выбором (Selection Sort) : Находит минимальный элемент из неотсортированной части массива и помещает его в конец отсортированной части.

  4. Быстрая сортировка (Quick Sort): Выбирает опорный элемент, и перегруппирует элементы вокруг него, так что элементы меньше опорного оказываются перед ним, а большие — после. Процесс повторяется рекурсивно для подмассивов до и после опорного элемента.

  5. Сортировка слиянием (Merge Sort): Разделяет массив на две части, рекурсивно сортирует их, а затем сливает в один отсортированный массив.

  6. Кучная сортировка (Heap Sort): Преобразует массив в двоичную кучу, затем извлекает элементы из кучи один за другим, восстанавливая свойства кучи после каждого извлечения.

  7. Сортировка Шелла (Shell Sort): Улучшенная версия сортировки вставками, использует последовательность шагов (интервалов), сокращая количество перемещений элементов на большие расстояния.

  8. Поразрядная сортировка (Radix Sort) : Сортирует числа путем обработки отдельных цифр. Функционирует от младших разрядов к старшим или наоборот.


Какие алгоритмы работы со строками знаете?

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

  1. Поиск подстроки:

    • Алгоритм Кнута-Морриса-Пратта (KMP): Эффективно ищет вхождения подстроки в строке, используя префиксную функцию для минимизации количества обратных шагов.

    • Алгоритм Бойера-Мура: Использует суффиксные правила и информацию о встреченных символах для ускорения поиска подстроки.

    • Алгоритм Рабина-Карпа: Использует хэш-функцию для быстрого сравнения подстрок, что позволяет эффективно искать множество шаблонов одновременно.

  2. Сортировка строк:

    • Поразрядная сортировка (Radix Sort): Особенно эффективна для сортировки строк, так как обрабатывает символы строк начиная с младших разрядов.

    • Сортировка слиянием: Хорошо подходит для сортировки больших массивов строк из-за своей стабильности и эффективности на больших данных.

  3. Динамическое программирование в строках:

    • Расстояние Левенштейна (редакционное расстояние): Вычисляет минимальное количество операций вставки, удаления и замены, необходимых для преобразования одной строки в другую.

    • Нахождение наибольшей общей подпоследовательности (LCS): Определяет длину наибольшей последовательности символов, которая появляется в обеих строках в том же порядке.

  4. Палиндромы:

    • Алгоритмы для определения наибольшей палиндромической подстроки: Используют различные методы, включая динамическое программирование и расширение вокруг центра, для нахождения самых длинных палиндромов в строке.
  5. Парсинг и лексический анализ:

    • Регулярные выражения: Предоставляют мощные средства для поиска и извлечения данных из строк с помощью заданных паттернов.

Какие алгоритмы на графах знаете?

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

  1. Поиск в глубину (DFS, Depth-First Search):

    • Обходит граф, углубляясь как можно дальше, прежде чем отступать.
  2. Поиск в ширину (BFS, Breadth-First Search):

    • Обходит граф по слоям, начиная с исходной вершины и распространяясь равномерно во все стороны.
  3. Поиск кратчайшего пути:

    • Алгоритм Дейкстры: Находит кратчайшие пути от одной вершины до всех других в графе с неотрицательными весами рёбер.

    • Алгоритм Беллмана-Форда: Решает ту же задачу, что и Дейкстра, но работает и с отрицательными весами рёбер.

    • Алгоритм Флойда-Уоршелла: Находит кратчайшие пути между всеми парами вершин в графе.

  4. Минимальное остовное дерево (Minimum Spanning Tree, MST):

    • Алгоритм Прима: Построение MST, начиная с выбранной вершины и добавляя к ней ближайшие вершины с минимальными весами рёбер.

    • Алгоритм Краскала: Построение MST, выбирая рёбра с наименьшим весом, которые не образуют циклов.

  5. Топологическая сортировка:

    • Упорядочивает вершины так, чтобы для каждого направленного ребра из вершины U в вершину V, U шло перед V.
  6. Сильно связные компоненты:

    • Алгоритм Косарайю: Находит сильно связные компоненты в направленном графе.

    • Алгоритм Тарьяна: Эффективный способ нахождения сильно связных компонент с использованием одного DFS обхода.

  7. Сети и потоки:

    • Алгоритм Форда-Фалкерсона: Расчёт максимального потока из источника в сток в сети.

    • Алгоритм Эдмондса-Карпа: Реализация Форда-Фалкерсона с использованием BFS для нахождения увеличивающих путей.


Какие алгоритмы применяли с STL? В чем преимущество использования алгоритмов перед собственноручно написанными функциями?

Применяемые алгоритмы STL :
  1. std::sort: Сортировка элементов.

  2. std::find: Поиск элемента.

  3. std::copy: Копирование элементов.

  4. std::accumulate: Накопление значений (сумма).

  5. std::transform: Преобразование элементов.

  6. std::for_each: Применение функции к каждому элементу.

Преимущества использования алгоритмов STL :
  1. Оптимизация: Алгоритмы STL тщательно оптимизированы и протестированы на производительность.

  2. Безопасность: Алгоритмы обеспечивают безопасное и правильное выполнение операций, минимизируя вероятность ошибок.

  3. Универсальность: STL алгоритмы могут работать с любыми контейнерами, поддерживающими соответствующие итераторы.

  4. Читаемость и поддерживаемость: Код с использованием STL алгоритмов обычно короче и легче читается, что упрощает его поддержку и развитие.

  5. Совместимость: Алгоритмы STL хорошо интегрированы с остальной частью стандартной библиотеки C++.


Что такое сложность алгоритма и от чего она зависит?

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

Виды сложности:

  1. Временная сложность: Оценивает количество шагов или операций, необходимых для выполнения алгоритма.

  2. Пространственная сложность: Оценивает объем памяти, требуемый алгоритмом.

Зависит от:

  1. Размер входных данных: Как изменяется количество шагов или используемой памяти в зависимости от размера входных данных.

  2. Структура данных: Выбор структуры данных может повлиять на сложность операций.

  3. Тип операций: Например, поиск, сортировка, вставка и удаление могут иметь разную сложность для различных алгоритмов.

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

Собеседования: C++

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: C++-разработчик, Разработчик системного ПО. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.