No Image

Программы для изучения алгоритмов

СОДЕРЖАНИЕ
422 просмотров
10 марта 2020
  • Ответы экспертов, 10 августа 2018 в 19:54
  • Анастасия Витвицкая

Нам пришел вопрос от подписчика Tproger, которым мы хотим поделиться с вами:

«Как лучше всего изучать алгоритмы?»

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

Николай Лопин , преподаватель курса профессия frontend-разработчик университета онлайн-профессий Нетология

Я не рекомендую сразу углубляться в алгоритмы и изучать их тем, кто только начинает программировать. Это сложная область computer science, и изучать ее без должной подготовки непросто. Также важно сразу определить конечную цель изучения алгоритмов: расширить общий кругозор (хочу что-то понимать), подготовиться к собеседованию или научиться решать конкретные задачи и улучшить свой код. Каждый сценарий определяет, насколько глубоко нужно нырнуть, чтобы достичь цели.

1-й уровень: вы хотите что-то понимать в алгоритмах. В этом случае вам поможет учебная литература, и я бы рекомендовал книгу «Грокаем алгоритмы». В ней понятно изложена суть без лишних деталей, много иллюстраций, а вся необходимая математика объясняется по ходу. Если вы владеете английским, то лучше читать английскую версию. А если не любите читать книги, то на Khan Academy есть вводный курс для начинающих.

2-й уровень: подготовка к собеседованию. Будет полезно повторить основные понятия и алгоритмы и поупражняться в их использовании. Для тренировки алгоритмических задач на любом из языков есть специализированные сервисы: HackerRank, Codewars и LeetCode. Ваша задача – научиться решать задачи уровня medium и выше. С литературой сложнее. Есть классические книги Кормена, Скиены, Седжвика. В первую очередь, обращайте внимание на книги с алгоритмами на вашем языке программирования. Например, для Python есть «Problem Solving with Algorithms and Data Structures using Python», много подобной литературы издано для Java и C/C++. Если вам интересны видеокурсы, то стоит посмотреть курсы Принстонского или Стенфордского университета. Они нудноваты, но объясняют основы.

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

Тимур Нозадзе , руководитель отдела разработки REG.RU

Для начала нужно освоить теоретический фундамент: основные структуры данных, их свойства и методы работы с ними, анализ и сложность алгоритмов, их основные типы и классы. Не надо заучивать наизусть все виды сортировок или мудрёных деревьев — это вряд ли возможно и абсолютно бесполезно. Нужно понимать, чем они могут друг от друга отличаться и как выбрать правильный алгоритм или структуру данных в конкретном случае. Теорию можно получить из разных источников: есть много отличных книг, видеокурсов, сайтов, посвящённых этой теме. Какой вариант выбрать — вопрос личных предпочтений к формату обучения.

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

Ну, и главное, конечно, использовать эти знания в работе над реальными задачами. Многие считают, что алгоритмика — это удел 1% программистов, которые делают какой-то rocket science. Это не так. Понимание теории алгоритмов и структур данных поможет вам быстрее находить решения многих повседневных задач, правильно оценивать формальную корректность программ и принципиальную достижимость желаемого результата, не писать код, который тормозит на ровном месте, более глубоко понимать, как работают базы данных и тому подобное.

Сергиус Офицеров , преподаватель HackerU

(ответ подготовлен совместно с Михаилом Субботиным, преподавателем израильской высшей школы IT и безопасности HackerU)

Изучать алгоритмы лучше всего по книжкам, но с реальными задачами. Если просто читать про алгоритмы и не использовать их, они быстро забудутся. Алгоритмами — логическим мышлением построения — владеют не так уж и много программистов. Это подтверждает весенний тест-опрос портала Tproger. Алгоритмы подразумевают хорошие математические знания или способность быстро определить, какой алгоритм лучше подходит под данную задачу. Ещё интереснее доработать существующий алгоритм. Самый «жирный» способ — разработать алгоритмы самостоятельно. Это уже ближе к Computer Science.

Екатерина Кошкарова , ведущий специалист департамента информационных решений компании РДТЕХ

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

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

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

Александр Пряхин , декан факультета веб-разработки GeekUniversity, онлайн-университет Mail.Ru Group

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

Читайте также:  Oki b431dn драйвер windows 7

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

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

Теперь, когда мы разобрались в том, что реализовывать сортировку пузырьком самостоятельно – полезно, возникает вопрос: как именно к этому подступиться? Обычно при поиске информации по алгоритмам начинается хождение по запутанным статьям в Википедии. Но начинать надо с основ – тех вещей, при помощи которых описываются алгоритмы:
1. Блок-схемы
2. О-нотация («О» большое и «о» малое)
3. Псевдокод

Многие базовые вещи для тех, кто интересуется алгоритмами, неплохо описаны в книге Томаса Кормена «Алгоритмы. Вводный курс». Эта книга рассказывает об аспектах реализации алгоритмов в программировании. Для людей, которые лучше воспринимают визуальную информацию, есть очень много иллюстраций работы сортировок: в виде анимаций с примерами кода; в виде видео.

После этого можно попробовать поработать с фундаментальным типом алгоритмов — сортировкой. Такие алгоритмы не требуют специализированных знаний, о которых мы ещё поговорим ниже, и используют для своей работы базовые конструкции: циклы, массивы и ветвления. Стоит изучить различные сортировки — перечислю несколько видов по мере увеличения их сложности: сортировка пузырьком, шейкерная сортировка, сортировка расчёской, вставками, сортировка Шелла, быстрая сортировка и т.д. Также стоит узнать, какая из сортировок используется в вашем языке программирования при вызове встроенных методов сортировки. Основная идея состоит в том, чтобы, во-первых, реализовать сортировку в коде, во-вторых — проверить соответствие своей реализации оценке сложности алгоритма (см. О-нотации), т.е. действительно ли ваша реализация тратит ожидаемое время и потребляет ожидаемый объём памяти в зависимости от размера полученных на вход данных. Иными словами при изменении объёма данных в два раза алгоритм должен будет работать, к примеру (для линейной сложности), в два раза дольше.

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

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

Изучить и реализовать стоит алгоритмы
– Беллмана-Форда,
– Дейкстры,
– двоичного поиска (и двоичные деревья как инструмент),
– поиска в глубину и ширину.

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

Книги по теме:
– Томас Х. Кормен «Алгоритмы. Вводный курс»
– Род Хаггарти «Дискретная математика для программистов»
– Фёдор Новиков «Дискретная математика для программистов»
– Стивен Скиена «Алгоритмы. Руководство по разработке»
– Роберт Седжвик «Фундаментальные алгоритмы на С++»
– Ричард Берд «Жемчужины проектирования алгоритмов»

Описание Алгоритм

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

Создание программ в Алгоритм

Принцип разработки ПО, в конструкторе Алгоритм 2, представляет собой построение логической цепи действий. С помощью визуальных функций создается интерфейс будущей программы, после чего к элементам привязываются события, условия и действия. Например, добавив в программу кнопку, вы можете назначить ей действие открывания файла, воспроизведения звука, смены текста и т.д. Функционал Алгоритм 2.7 весьма разнообразен и при умелом подходе может выдать очень интересные результаты.

Особенности конструктора:

  • Удобный интерфейс.
  • Множество готовых функций и визуальных объектов.
  • Возможность создания браузеров, текстовых редакторов и медиа-плееров за пару минут.
  • Создание программ, работающих с файлами, папками и реестром.
  • Набор полезных объектов с расширенными возможностями. К примеру перезагрузка ПК, или рабочий стол.
  • Вывод готовой программы в формате exe, за пару кликов.
  • Экспорт программы в язык Visual Basic.NET, для доработки на высоком уровне программирования.
Читайте также:  Записать iso на hdd

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

В этой подборке представлен список книг, веб-сайтов и онлайн-курсов, дающих понимание как простых, так и продвинутых алгоритмов.

Воодушевленный awesome-awesomeness и некоторыми другими шикарными библиотеками, я написал список лучших, на мой взгляд, источников для изучения и практики знаний алгоритмов. Если вы хотите поспособствовать развитию списка, пожалуйста, прочтите Гайд по развитию списка.

Веб-сайты, которые вам стоит использовать, чтоб выучить классические алгоритмы:

  • A Visual Guide to Graph Traversal Algorithms — Интерактивная визуализация показывает, как работает алгоритм поиска в глубину графа.
  • Algomation — Поучительное и анимированное описание алгоритмов.
  • Algorithm Visualizer — Тонны анимированых алгоритмов (с кодом, конечно же), можно также создавать свои алгоритмы.
  • Algorithms Visualization — Коротенькая статья, посвящённая визуализации алгоритмов.
  • Big-O Cheat Sheet — Сложности повседневных алгоритмов, используемых в анализе данных.
  • Data Structure Visualizations — Визуализируйте поведение структур данных и делайте операции с ними.
  • Geeks for Geeks — Много-много хорошо объяснённых и реализованных алгоритмов.
  • Rosetta Code — Хрестоматия по программированию, цель которой — показать использование множества алгоритмов и структур данных в разных языках программирования.
  • Sorting Algorithms — Красивые и простые анимации алгоритмов сортировки, не без коротеньких примеров с кодом и их обсуждений.
  • Stoimen’s web log — Некоторые алгоритмы, которые очень понятно объяснены.
  • VisuAlgo — Визуализация структур данных и алгоритмов посредством анимации.
  • Wikipedia — Algorithms — Ко-неч-но-же!
  • Wikipedia — Data Structures — А почему бы и нет?

Бесплатные и качественные курсы онлайн:

  • Algorithms: Divide and Conquer, Sorting and Searching, and Randomized Algorithms – Основные темы: асимптотика ("Большое О(х)"), сортировка и поиск, разделяй и властвуй, а также другие разные алгоритмы.
  • Algorithms: Graph Search, Shortest Paths, and Data Structures – Основные темы: структуры данных, графы и их применения.
  • Algorithms: Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming – Основные темы: жадные алгоритмы и динамическое программирование.
  • Algorithms: Shortest Paths Revisited, NP-Complete Problems and What To Do About Them – Основные темы: кратчайший путь, NP-полные задачи и что это все значит для разработчика.
  • Algorithms, Part 1 — Этот курс затрагивает необходимую информацию об алгоритмах и структурах данных, в которой нуждается каждый программист, который серьезно относится к своему делу. Курс рассказывает о структурах данных, сортировке и алгоритмах поиска.
  • Algorithms, Part 2 — Вторая часть курса, которая сфокусирована на жадном алгоритме и динамических парадигмах, а также на NP-полных задачах.
  • Khan Academy Algorithms — курс по алгоритмам, созданный Томасом Корменом и Девином Балккомом.
  • MIT-6-006 — Хорошо описанные алгоритмы.
  • MIT-6-046j — Такой же курс, как и предыдущий, только с другими алгоритмами.
  • MIT-6-00sc — Простое и понятное введение в алгоритмы.
  • Udacity Intro to Algorithms — Курс по алгоритмам на Python.

Самые популярные книги для изучения алгоритмов:

Англоязычные:

  • Algorithm Design — Раскрывает суть решения задач, встречающихся в жизни.
  • Algorithms — Решения задач на Java, описание хороших практик ООП и бесплатные онлайн-курсы.
  • Data Structures Using C — Примеры использования структур данных.
  • Elementary Algorithms — Потрясающая книга об алгоритмах и структурах данных.
  • Grokking Algorithms — Книга об алгоритмах и их практических применениях с множеством иллюстраций.
  • Introduction to Algorithms — Необходима к прочтению!
  • Swift Algorithms and Data Structures — Практическое руководство по теории и коду.
  • The Algorithm Design Manual — Книгу легко читать, и она полна примеров из жизни.
  • The Art of Computer Programming — Просто хорошая книга.

Русскоязычные:

Новичку

  • Алгоритмы на Java — Исчерпывающее толкование структур данных и алгоритмов сортировки, поиска, обработки графов и строк, включая пятьдесят алгоритмов, которые должен знать каждый программист.
  • Алгоритмы. Вводный курс — Книга предназначена для всех, кого интересуют вопросы, связанные с компьютерными алгоритмами, но отсутствие времени не позволяет взяться за серьезный труд.
  • Карты метро и нейронные сети. Теория графов — Отличная книга для тех, кому не терпится познать такой раздел математики, как Теория графов.
  • Дискретная математика для программистов — Основополагающее введение в дискретную математику, без знания которой невозможно успешно заниматься информатикой и программированием.
  • Дискретный анализ — Пособие написано по материалам вводного лекционного курса математико-механического факультета Санкт-Петербургского государственного университета.
  • Дискретная математика — В этом учебнике изложены все основные разделы дискретной математики и описаны важнейшие алгоритмы на дискретных структурах данных.
  • Problem Solving with Algorithms and Data Structures (перевод) — Изложение в книге идёт от простого (что такое алгоритм, как оценить его производительность) к сложному (деревья, графы) с живыми примерами и кодом.
  • Алгоритмы — В этой книге подробно разбираются основные методы построения и анализа эффективных алгоритмов.
  • Структуры данных и алгоритмы в Java — Помимо простых и ясных примеров, автор приводит небольшую демонстрационную программу, которую можно запустить в веб-браузере.
  • Анализ алгоритмов. Вводный курс — Особое внимание уделено алгоритмам параллельной обработки, редко освещаемым в литературе на русском языке.
  • Программирование: теоремы и задачи — Книга содержит задачи (с решениями) по программированию различной трудности.
  • Алгоритмы. Теория и практическое применение — Из этой книги вы узнаете, где алгоритмы применяются и как их анализировать, чтобы понять их поведение.
Читайте также:  Программа для рисования эскизов

Знающему основы для углубленного изучения

  • Алгоритмические трюки для программистов — В этой книге автор делится с читателями разнообразными приёмами из своей коллекции в области прикладного и системного программирования.
  • Автоматное программирование — В книге рассматривается автоматное программирование — подход к разработке программных систем со сложным поведением, основанный на модели автоматизированного объекта управления
  • Алгоритмы + структуры данных = программы — Книга содержит описание и анализ основных алгоритмов, методов построения программ.
  • Алгоритмы и структуры данных. Новая версия для Оберона — В классическом учебнике тьюринговского лауреата аккуратно, на тщательно подобранных примерах прорабатываются основные темы алгоритмики — сортировка и поиск, рекурсия, динамические структуры данных.
  • Введение в теорию автоматов, языков и вычислений — Книга известных американских ученых посвящена теории автоматов и соответствующих формальных языков и грамматик.

Профессионалу

  • Теория и практика С++ — Книга посвящена обсуждению сложных вопросов программирования., каких как реализация разреженных массивов, алгоритмы шифрования и сжатия данных, а также проблемы разработки собственных языков программирования и написания интерпретаторов для них.
  • Искусство программирования — Эта книга была признана одной из двенадцати лучших физико-математических монографий столетия.
  • Алгоритмы. Построение и анализ — Книга удачно объединяет в себе полноту охвата и строгость изложения материала.
  • Algolist. Алгоритмы, методы, исходники — Огромный список разнообразных алгоритмов по математике, графике, кодированию, сортировкам, структурам данных, нервным сетям и многому другому.

Реализация большинства классических алгоритмов во многих языках программирования

CoffeeScript

Erlang

JavaScript

Objective-C

Python

Scala

Swift

Языково-независимые

Онлайн-практика для того, чтоб оттачивать свои навыки:

  • ACM-ICPC Live Archive — Сотни задач с предыдущих региональных состязаний ACM-ICPC и мировых состязаний World Finals.
  • AIZU ONLINE JUDGE — Японская онлайн практика.
  • CodeChef — Больше задач и ежемесячные состязания.
  • Codeforces — Единственный сайт, где можно посостязаться в знаниях платформы Web 2.0.
  • CodeWars — Веб-сайт, который предлагает задачи по алгоритмам на многих языках и для многих уровней сложности.
  • CoderByte — Скромный веб-сайт с задачами на оттачивание алгоритмов для начального и продвинутого уровней. Поддерживает множество популярных языков программирования, таких как С++, Python, JavaScript, Ruby и так далее.
  • HackerEarth — Решайте задачи, используя алгоритмы и принимайте участие в решении задач, которые задают при приёме на работу.
  • HackerRank — Онлайн практика по известным алгоритмам и функциональном программировании.
  • Infoarena — Румынская онлайн-практика. 1500+ задач по алгоритмам.
  • LavidaOnlineJudge — Корейская онлайн-практика(около половины на английском) 1300+ задач.
  • Learneroo Algorithms Tutorials — Учитесь и практикуйтесь в написании алгоритмов, решая задачи онлайн.
  • LeetCode — Выучите алгоритмы и подготовьтесь к интервью.
  • PKU JudgeOnline — Китайская онлайн-практика.
  • ProjectEuler — Математические задачи, которые могут быть решены с использованием алгоритмов (или даже с помощью карандаша, зависит от того, сколько вы уже знаете).
  • Rosalind — Платформа для изучения биоинформатики и программирования, решая задачи.
  • ShareCode — Онлайн практика и состязания с множеством задач по алгоритмам.
  • Snakify — Вводный курс по Python с 100+ задачами по алгоритмам и отладке (российский).
  • SPOJ — Еще больше задач.
  • TopCoder — Множество задач по графическому дизайну, анализу данных и разработки в целом.
  • URI — Бразильская онлайн-практика. Не так много задач по сравнению с конкурентами, но их база растет, а также у них есть онлайн-состязания.
  • UVA — Ещё много задач с предыдущих региональных состязаний ACM-ICPC и мировых состязаний World Finals.
  • Алгоритмы от Владимира Моженкова — Видеоуроки по алгоритмам, материал которых будет понятен новичкам.
  • Типы и структуры данных от Владимира Моженкова — Видеоуроки по структурам данных, материал которых будет понятен новичкам.
  • Алгоритмы и структуры данных, Первый семестр — Серия видеоуроков, посвященная продвинутым алгоритмам и структурам данных.
  • Алгоритмы и структуры данных, Второй семестр — Ну и продолжение первых двух частей лекций по уже более сложным алгоритмам и структурам данных.
  • Алгоритмы и структуры данных. Подготовительный курс — Цель курса — ознакомить слушателей с основными алгоритмами, применяемыми для разработки программного обеспечения.
  • Введение в алгоритмы — Серия видеоуроков, которая посвящена введению новичков в основы алгоритмов
  • С++ алгоритмы — Реализация самых распространённых алгоритмов на С++
  • Алгоритмы и структуры данных — Подборка видеоуроков об алгоритмах и структурах данных от Computer Science Center
  • Алгоритмы в биоинформатике — Широкий обзор разделов биоинформатики с упором на методы чтения генома, а также на алгоритмы сравнения строк и алгоритмы неточного поиска подпоследовательностей в больших текстах.

Некоторые инструменты, которые помогут вам в освоении алгоритмов

  • flow-chart.js — Иструмент, помогающий вам создавать диаграммы и схемы, которые могут моделировать алгоритмы.
  • interactive-coding-challenges — Интерактивные задачки по алгоритмам и структурам данных.

Лицензия
И в интересах авторского лева(материал свободный, и все его изменённые или дополненные формы должны оставаться свободными — прим. переводчика) вот наша лицензия:

Эта работа находится под лицензией Creative Commons Attribution 4.0 International License(ссылка).

Комментировать
422 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock
detector