21 Дек 2017 | Просмотры: 984

Алгоритмы (теория/практика): Часть 1. Введение

Материал статей может исправляться и дополняться.

Приветствую тебя на страницах моего блога, дорогой незнакомец! Я тут иногда публикую свои собственные статьи по разным темам, которые имеют отношение к IT.

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

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

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

О важном

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

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

Зачем программисту вообще изучать алгоритмы?

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

Естественно всё зависит от вашей конечной цели. Если для вас достаточно изучить какой-нибудь язык и научиться решать однотипные задачки, периодически забегая на StackOverflow в случае возникновения трудной ситуации, то вам не нужна эта статья. Если же вы хотите стать специалистом в своей области и твёрдо решили это осуществить, то… вам тоже не нужна эта статья. На вашем месте я бы лучше почитал книги, чем статьи (кстати, список хорошей литературы я оставил в самом конце статьи). Если же вы еще не поняли, то оставайтесь со мной. У меня нет цели научить вас умению работать с алгоритмами, моя цель – показать вам что это такое и как это можно использовать. Вам придется читать книги, если вы действительно хотите разбираться в этом. Тем не менее, здесь я вас за ручку проведу по основным темам, которые вы встретите на своем нелёгком пути, и мы вкратце рассмотрим каждую из них.

Нужно понимать, что программист – это не только тот, кто бездумно набирает код, решая однотипные задачи, которые приходят к нему от начальства, это всё-таки, в первую очередь, специалист в области IT. Это огромная область и программирование — это лишь одна из составных частей, из которых строится Computer Science. Сразу же предупрежу, что это по большей части моё мнение, поэтому соглашаться с ним или нет — дело исключительно ваше.

Программирование находится на очень высоком уровне абстракции. При написании программ вы манипулируете данными, работаете с вычислениями, с памятью, но вы не задумываетесь о том, как работает компилятор вашего языка, не задумываетесь над тем, как работает ваша операционная система, как она взаимодействует с железом, как ваши программы исполняются на самом низком уровне, как процессор производит вычисления, как оперативная память «запоминает» информацию и о многом другом, что скрыто от глаз обычного пользователя. И это очень хорошо, так как позволяет практически каждому освоить какой-нибудь язык и писать на нём вполне рабочие программы. Но вы никогда не сможете назвать себя специалистом без знаний внутреннего устройства того, с чем вы работаете. Я не буду грузить вас терминами и темами, которые стоит изучить, если вы еще этого не сделали, а перейду сразу же к нашей.

Алгоритмы также являются одной из фундаментальных разделов в Computer Science, которую многие «программисты» почему-то обходят стороной или считают недостойным того, чтобы тратить на них своё драгоценное время. Учить языки программирования, безусловно, очень важно, но вы должны понимать, что алгоритмы развиваются независимо от конкретного языка. Учить алгоритмы — значит учиться думать как программист, учиться находить решения самостоятельно, учиться выявлять собственные ошибки и выбирать наиболее эффективное решение конкретной задачи в условиях ограниченной производительности вычислительных систем.

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

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

Отрицание: так ли это важно?

Ни для кого не секрет, что любую задачу можно решить несколькими способами. Допустим, если вам нужно попасть из пункта А в пункт Б, то у вас есть множество способов сделать это – доехать на машине, на такси, в метро, либо пройтись пешком. Окончательное ваше решение будет зависеть от разных обстоятельств – деньги, время, быть может, настроение. Доехать на машине, конечно же, хорошо. Но что если на дорогах пробки? Тогда можно сесть в метро. Хорошо, но прогуляться пешком тоже очень приятно.

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

Гнев: алгоритмы — это очень сложно

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

Торги: все алгоритмы уже реализованы в библиотеках!

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

Депрессия: это займет очень много времени

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

Принятие: с чего же начать?

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

Следующая статья

Алгоритмы (теория/практика): Часть 2. Что такое алгоритм?

Литература для самостоятельного обучения (будет дополняться)

  1. Томас Х. Кормен — Алгоритмы. Вводный курс
  2. Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы. Построение и анализ
  3. Джефри Макконнелл — Основы современных алгоритмов
  4. Роберт Седжвик — Фундаментальные алгоритмы на С++/Фундаментальные алгоритмы на Java
  5. Дональд Э. Кнут — Искусство программирования