Перейти к содержимому

Практика по алгоритмам

Программирование в проектах любой сложности всегда включает анализ и решение задач. Для решения задач необходимо выявление алгоритма решения и его реализация в программе. Для эффективного выполнения этого нужно натренировать определенный ход мышления, называемый алгоритмическим мышлением.

Несмотря на то, что простые задачи могут показаться нереалистичными (“ну кто будет суммировать массив чисел в реальном мире? есть же уже встроенная функция для этого!”) их решение тренирует то самое алгоритмическое мышление.

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

Цель данной работы научиться:

  • анализировать и понимать задачу;
  • разбить задачу на подзадачи, подзачачи на еще меньшие подзадачи;
  • разработать алгоритм: уметь логически вывести и объяснить каждый шаг алгоритма исходя из условий задачи;
  • уметь представить условия задачи в программе, правильно определить структуры данных и интерфейс;
  • уметь представить шаги алгоритма в инструкциях программы.

Все это необходимо научится делать достаточно быстро на простых задачах.

В идеале, элементарные операции и инструкции из кода у вас должны быть интуитивно эквивалентны, то есть вы должны сразу понимать операцию, глядя на синтаксис языка программирования, без размышлений или поиска примеров синтаксиса, и наоборот, уметь преобразовать словесное описание операции в код.

  • Сделайте функцию которая попарно перемножает числа из 2 массивов, записывая результат в 1-ый массив.
Какой будет интерфейс?

Нужно принять первый и второй массив параметром. В первый мы также будем вписывать ответ.

Возвращаемый тип void, потому что возвращение происходит как побочный эффект, путем вписывания в массив первого параметра. Функция не возвращает никакого значения как результат.

void product(std::span<int> inputOutput, std::span<int> coefficients)
{
}

Можно также сделать второй параметр константой, потому что элементы массива не будут перезаписываться.

void product(std::span<int> inputOutput, std::span<const int> coefficients)
{
}
  • Убедитесь в ней в том, что спаны одинаковой длины, используя assert.
Как?
assert(inputOutput.size() == coefficients.size());
  • Реализуйте версию с бесконечным циклом, используя break вручную.

  • Реализуйте версию с циклом while с условием.

  • Реализуйте версию с циклом for.

Если не чувствуете себя достаточно уверенно, попрактикуйтесь с разными алгоритмами, например:

  • Подсчет, сколько чисел в массиве больше, чем 5;
  • Поиск максимального значения в массиве;
  • Поиск двух наибольших значений в массиве;
  • Генерирование первых n простых чисел;
  • Подсчет чисел Фиббоначи;
  • и так далее.

Можете практиковаться на простых задачах на LeetCode