# Как пользоваться этой книгой !!! tip Для получения наилучшего опыта чтения рекомендуется полностью прочитать этот раздел. ## Соглашения о стиле изложения - Главы, помеченные `*` в заголовке, являются дополнительными и содержат более сложный материал. Если времени мало, их можно пропустить. - Профессиональные термины выделяются полужирным шрифтом в печатной и PDF-версии или подчеркиванием в веб-версии, например массив (array). Рекомендуется запоминать их для удобства чтения литературы. - Важные моменты и обобщающие фразы будут **выделяться полужирным шрифтом**, и на такие тексты следует обращать особое внимание. - Слова и выражения со специальным смыслом будут отмечаться «кавычками», чтобы избежать неоднозначности. - Когда термины различаются между языками программирования, в качестве стандарта используется Python. Например, `None` применяется для обозначения «пустого» значения. - В некоторых местах книга отходит от стандартов комментирования программного кода ради более компактного оформления. Комментарии в основном делятся на три типа: заголовочные, содержательные и многострочные. === "Python" ```python title="" """Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п.""" # Содержательный комментарий: подробно поясняет код """ Многострочный комментарий """ ``` === "C++" ```cpp title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Java" ```java title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "C#" ```csharp title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Go" ```go title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Swift" ```swift title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "JS" ```javascript title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "TS" ```typescript title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Dart" ```dart title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Rust" ```rust title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код // Многострочный // комментарий ``` === "C" ```c title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Kotlin" ```kotlin title="" /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */ // Содержательный комментарий: подробно поясняет код /** * Многострочный * комментарий */ ``` === "Ruby" ```ruby title="" ### Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. ### # Содержательный комментарий: подробно поясняет код # Многострочный # комментарий ``` ## Эффективное обучение с помощью анимированных иллюстраций По сравнению с текстом видео и изображения обладают более высокой плотностью информации и более четкой структурой, поэтому их легче воспринимать. В этой книге **ключевые и сложные моменты в основном представлены в виде анимированных иллюстраций**, а текст служит пояснением и дополнением. Если во время чтения вы встречаете фрагмент с анимированной иллюстрацией, как на рисунке ниже, **используйте иллюстрацию в качестве основного источника информации, а текст - в качестве вспомогательного**, объединяя оба источника для понимания материала. ![Пример анимированной иллюстрации](../index.assets/animation.gif) ## Углубление понимания через практику кода Сопроводительный код этой книги размещен в [репозитории GitHub](https://github.com/krahets/hello-algo). Как показано на рисунке ниже, **исходный код содержит тестовые примеры и может быть запущен одним нажатием кнопки**. Если позволяет время, **рекомендуется самостоятельно набирать код**. Если времени на обучение мало, по крайней мере **просмотрите и выполните весь код**. Процесс написания кода приносит больше пользы, чем его чтение. **Настоящее обучение - это обучение на практике**. ![Пример запуска кода](../index.assets/running_code.gif) Подготовка к запуску кода в основном состоит из трех этапов. **Шаг 1: установка локальной среды программирования**. Воспользуйтесь [руководством](https://www.hello-algo.com/chapter_appendix/installation/) из приложения. Если среда уже установлена, этот шаг можно пропустить. **Шаг 2: клонирование или загрузка репозитория кода**. Перейдите в [репозиторий GitHub](https://github.com/krahets/hello-algo). Если у вас уже установлен [Git](https://git-scm.com/downloads), репозиторий можно клонировать следующей командой: ```shell git clone https://github.com/krahets/hello-algo.git ``` Также можно нажать кнопку «Download ZIP» в месте, показанном на рисунке ниже, напрямую скачать архив с кодом и затем распаковать его локально. ![Клонирование репозитория и загрузка кода](suggestions.assets/download_code.png) **Шаг 3: запуск исходного кода**. Как показано на рисунке ниже, для блоков кода, у которых сверху указано имя файла, соответствующий исходный файл можно найти в папке `codes` репозитория. Исходные файлы запускаются одним нажатием, что помогает не тратить лишнее время на отладку и сосредоточиться на изучении материала. ![Блоки кода и соответствующие исходные файлы](suggestions.assets/code_md_to_repo.png) Помимо локального запуска, **веб-версия также поддерживает визуальное выполнение Python-кода** (на базе [pythontutor](https://pythontutor.com/)). Как показано на рисунке ниже, можно нажать «Визуализировать выполнение» под блоком кода, чтобы раскрыть окно и наблюдать за выполнением алгоритма. Также можно нажать «Полноэкранный режим» для более удобного просмотра. ![Визуальный запуск Python-кода](suggestions.assets/pythontutor_example.png) ## Совместный рост через вопросы и обсуждения Во время чтения книги не стоит пропускать те места, которые остались непонятными. **Мы призываем вас задавать вопросы в разделе комментариев**: я и мои коллеги постараемся ответить вам как можно тщательнее, обычно в течение двух дней. Как показано на рисунке ниже, в веб-версии у каждой главы внизу есть раздел комментариев. Рекомендуется уделять внимание его содержанию. С одной стороны, это поможет увидеть, с какими трудностями сталкиваются другие читатели, восполнить пробелы и подтолкнуть себя к более глубокому пониманию. С другой стороны, мы надеемся, что вы будете отвечать на вопросы других участников и делиться своими мнениями. ![Пример раздела комментариев](../index.assets/comment.gif) ## Дорожная карта изучения алгоритмов В целом процесс изучения структур данных и алгоритмов можно разделить на три этапа. 1. **Этап 1: введение в алгоритмы**. Необходимо познакомиться с особенностями и применением различных структур данных, изучить принципы, процессы, назначение и эффективность различных алгоритмов. 2. **Этап 2: решение алгоритмических задач**. Рекомендуется начинать с популярных задач и решить не менее 100 из них, чтобы познакомиться с основными алгоритмическими проблемами. При первых попытках «забывание знаний» может стать испытанием, но это нормально. Следуйте при повторении задач «кривой забывания Эббингауза», и обычно после 3-5 циклов повторения материал хорошо запоминается. Рекомендуемые списки задач и планы практики см. в этом [репозитории GitHub](https://github.com/krahets/LeetCode-Book). 3. **Этап 3: построение системы знаний**. В процессе обучения можно читать статьи по алгоритмам, изучать каркасы решений и учебники, чтобы постоянно обогащать свою систему знаний. В решении задач можно применять продвинутые стратегии, например классификацию по темам, несколько решений одной задачи или одно решение для нескольких задач. Соответствующий опыт можно найти в различных сообществах. Как показано на рисунке ниже, содержание этой книги в основном охватывает «этап 1» и призвано помочь вам более эффективно перейти к обучению на этапах 2 и 3. ![Дорожная карта изучения алгоритмов](suggestions.assets/learning_route.png)