2

Как изучать алгоритмы решения задач?

Водоворот алгоритмов в природе и их надо знать

Нужны ли знания алгоритмов программисту

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

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

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

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

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

Алгоритмические структуры

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

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

Но изучение алгоритмов это очень сложная задача. Поэтому там, где это возможно, надо обойти этот процесс. Знания алгоритмов решения задач не требуется в следующих случаях:

  • когда можно написать программу, используя множество существующих программных средств, таких как сортировка массивов самыми различными способами(метод sort() есть во всех библиотеках);
  • когда, имеется возможность встроенными средствами языка программирования (отладчик, оптимизатор и т.п.) определить какой из существующих методов работает лучше и где в программе появляются проблемы с быстродействием, использованием памяти и т.п.

В обоих этих случаях надо хорошо знать платформу(среду программирования) и умело  использовать ее возможности.
Резюмируя приведенные доводы, можно сказать – каждый по-своему прав. Любая точка зрения имеет право на существование.

Основные подходы к изучению алгоритмов программистами

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


Изучение по книге

Сущность основных рекомендаций сводится в следующему:

  • изучать алгоритмы решения задач лучше всего по книжкам, но с реальными задачами, а не просто читать про алгоритмы и не использовать их, они быстро забудутся, а ещё интереснее пытаться модифицировать существующий алгоритм и разработать подобный алгоритм самостоятельно;
  • в процессе изучения теории алгоритмов важно абстрагироваться от инструментария, «забыть» о языках программирования; недаром лучшие книги по алгоритмам содержат в себе примеры «программ», реализованных на псевдоязыках, так называемом псевдокоде, что позволяет не задумываться о реализации и тонкостях языка программирования и сконцентрироваться на логике;
  • для начала нужно освоить теоретический фундамент: основные структуры данных, их свойства и методы работы с ними, анализ и сложность алгоритмов, их основные типы и классы, не надо заучивать наизусть все виды сортировок или мудрёных деревьев — это вряд ли возможно и абсолютно бесполезно;
  • после изучения теоретического материала обязательно нужно научиться применять эти знания, используя для этого специализированные ресурсы типа HackerRank, в которых рассматриваются алгоритмы разного уровня сложности, начиная с самого базового, и затрагивающие много разных тем, или свои собственные задачи, но главное для решения любых задач недостаточно знать какой-то базовый алгоритм, нужно уметь приспособить его к конкретной ситуации, модифицировать, совместить с другими подходами;
  • не стоит ориентироваться исключительно на теорию: после изучения каждого алгоритма старайтесь реализовывать его, находить ему применение для какой-либо первой пришедшей в голову задачи и главное, конечно,понимание теории алгоритмов и структур данных поможет вам быстрее находить решения многих повседневных задач, правильно оценивать формальную корректность программ и принципиальную достижимость желаемого результата, не писать код, который тормозит на ровном месте, более глубоко понимать, как работают базы данных и тому подобное;
  • на начальном этапе программирования вообще не рекомендуется углубляться в алгоритмы решения задач и изучать их, потому что это сложная область computer science, и изучать ее без должной подготовки непросто;
  • — если Вы хотите что-то понимать в алгоритмах, то Вам поможет учебная литература, например, книга «Грокаем алгоритмы», если знания нужны для подготовки к собеседованию, то полезно повторить основные понятия и алгоритмы и поупражняться в их использовании. Для тренировки решения алгоритмических задач на любом из языков программирования есть специализированные сервисы: HackerRank, Codewars и LeetCode. Используя их возможности надо научиться решать задачи среднего уровня и выше;
  • если Вы хотите лучше решать поставленные задачи, то надо четко определить, алгоритмы из какой области знаний нужно изучить, в первую очередь, обращайте внимание на книги с алгоритмами на вашем языке программирования Python, Java и C, C++, С# и т.п.

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

Один мой уважаемый учитель говорил мне — если не понимаешь, то учи наизусть, понимание со временем приходит. Знания сами по себе не приходят никогда, а добываются кропотливым трудом, а понимание приходит иногда само собой. Книга и карандаш — вот два главных инструмента при изучении алгоритмов решения задач на ЭВМ. Самый тупой карандаш острее самой острой памяти. Если применить к этому правилу алгоритмы и программирование, алгоритмы это понимание, а программирование — это знания. 

Использование среды программирования для изучения алгоритмов

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

При этом с одной стороны надо изучать алгоритмы только интересующей области знаний(работы, профессии), с другой — надо научиться разбирать и анализировать существующие алгоритмы, не смотря на то, что они реализованы во многих программах. Более того именно существующие программы могут помочь в освоении запрограммированных алгоритмов.

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

Для примера рассмотрим методику изучения алгоритма пузырьковой сортировки элементов массива на языке Pascal.
Находим программу пузырьковой сортировки массива. Создаем проект консольного типа. Вставляем в него текст программы. Если имеются ошибки, в процессе отладки программы устраняем их.


Программа сортировки

Когда программа выполняется, расставляем точки останова в местах с которых будем контролировать значения переменных и элементов сортируемого массива. Запускаем программу. Выполнение остановится на первой контрольной точке. Далее выполнение осуществляется по шагам, путем нажатия клавиши F8.

Нулевая итерация внутреннего цикла (i=1, j=1) заключается в выборе первого элемента массива и сравнении его со вторым элементов. Так как результат “ложный”, то ничего не делается.

Первая итерация внутреннего цикла – сравнивается второй элемент с третьим. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 39 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место второго элемента. Произошла перестановка второго и третьего элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на позицию вверх. Первые три итерации внутреннего цикла показаны на рисунках ниже.


Первая итерация

Вторая итерация внутреннего цикла – сравнивается третий элемент с четвертым. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 245 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место третьего элемента. Произошла перестановка третего и четвертого элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на позицию вверх.


Вторая итерация

Третья итерация внутреннего цикла – сравнивается четвертый элемент с пятым. Сравнение “истина”. Запоминается больший элемент в переменной k=246. Затем меньший элемент 26 записывается на предыдущее место большего. В следующем операторе значение большего элемента записывается на предыдущее место четвертого элемента. Произошла перестановка четвертого и пятого элементов. Больший элемент(камень) опустился на одну позицию вниз, меньший элемент(пузырек) поднялся на позицию вверх.


Третья итерация

И так повторяется столько раз, каков размер массива. Для рассматриваемого примера 10 раз. При этом самый большой элемент окажется в самом низу.

Затем вся эта процедура повторяется еще десять раз. В результате в консоль выводится отсортированный массив.

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

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

Заключение

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

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

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

Вот таковы краткие рекомендации. Успехов всем в этом трудном деле.

 

ФотоМАСТЕР

brasm

Преподаватель со стажем 33 года. Кандидат технических наук, доцент.

2 комментария

  1. Можно ли зная результат выполнения программы раскрыть уровень абстракции по формальным признакам. Например, условно: есть машина которая делает шарики, условно. Можно ли исследуя вкус, запах, цвет шарика понять, хотя бы примерно, что именно происходит в машине? Пожалуйста, ответь.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *