mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-05 20:24:19 +00:00
258 lines
17 KiB
Markdown
258 lines
17 KiB
Markdown
---
|
|
comments: true
|
|
---
|
|
|
|
# 0.2 Как пользоваться этой книгой
|
|
|
|
!!! tip
|
|
|
|
Для получения наилучшего опыта чтения рекомендуется полностью прочитать этот раздел.
|
|
|
|
## 0.2.1 Соглашения о стиле изложения
|
|
|
|
- Главы, помеченные `*` в заголовке, являются дополнительными и содержат более сложный материал. Если времени мало, их можно пропустить.
|
|
- Профессиональные термины выделяются полужирным шрифтом в печатной и PDF-версии или подчеркиванием в веб-версии, например <u>массив (array)</u>. Рекомендуется запоминать их для удобства чтения литературы.
|
|
- Важные моменты и обобщающие фразы будут **выделяться полужирным шрифтом**, и на такие тексты следует обращать особое внимание.
|
|
- Слова и выражения со специальным смыслом будут отмечаться «кавычками», чтобы избежать неоднозначности.
|
|
- Когда термины различаются между языками программирования, в качестве стандарта используется 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=""
|
|
### Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. ###
|
|
|
|
# Содержательный комментарий: подробно поясняет код
|
|
|
|
# Многострочный
|
|
# комментарий
|
|
```
|
|
|
|
## 0.2.2 Эффективное обучение с помощью анимированных иллюстраций
|
|
|
|
По сравнению с текстом видео и изображения обладают более высокой плотностью информации и более четкой структурой, поэтому их легче воспринимать. В этой книге **ключевые и сложные моменты в основном представлены в виде анимированных иллюстраций**, а текст служит пояснением и дополнением.
|
|
|
|
Если во время чтения вы встречаете фрагмент с анимированной иллюстрацией, как на рисунке 0-2, **используйте иллюстрацию в качестве основного источника информации, а текст - в качестве вспомогательного**, объединяя оба источника для понимания материала.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-2 Пример анимированной иллюстрации </p>
|
|
|
|
## 0.2.3 Углубление понимания через практику кода
|
|
|
|
Сопроводительный код этой книги размещен в [репозитории GitHub](https://github.com/krahets/hello-algo). Как показано на рисунке 0-3, **исходный код содержит тестовые примеры и может быть запущен одним нажатием кнопки**.
|
|
|
|
Если позволяет время, **рекомендуется самостоятельно набирать код**. Если времени на обучение мало, по крайней мере **просмотрите и выполните весь код**.
|
|
|
|
Процесс написания кода приносит больше пользы, чем его чтение. **Настоящее обучение - это обучение на практике**.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-3 Пример запуска кода </p>
|
|
|
|
Подготовка к запуску кода в основном состоит из трех этапов.
|
|
|
|
**Шаг 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» в месте, показанном на рисунке 0-4, напрямую скачать архив с кодом и затем распаковать его локально.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-4 Клонирование репозитория и загрузка кода </p>
|
|
|
|
**Шаг 3: запуск исходного кода**. Как показано на рисунке 0-5, для блоков кода, у которых сверху указано имя файла, соответствующий исходный файл можно найти в папке `codes` репозитория. Исходные файлы запускаются одним нажатием, что помогает не тратить лишнее время на отладку и сосредоточиться на изучении материала.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-5 Блоки кода и соответствующие исходные файлы </p>
|
|
|
|
Помимо локального запуска, **веб-версия также поддерживает визуальное выполнение Python-кода** (на базе [pythontutor](https://pythontutor.com/)). Как показано на рисунке 0-6, можно нажать «Визуализировать выполнение» под блоком кода, чтобы раскрыть окно и наблюдать за выполнением алгоритма. Также можно нажать «Полноэкранный режим» для более удобного просмотра.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-6 Визуальный запуск Python-кода </p>
|
|
|
|
## 0.2.4 Совместный рост через вопросы и обсуждения
|
|
|
|
Во время чтения книги не стоит пропускать те места, которые остались непонятными. **Мы призываем вас задавать вопросы в разделе комментариев**: я и мои коллеги постараемся ответить вам как можно тщательнее, обычно в течение двух дней.
|
|
|
|
Как показано на рисунке 0-7, в веб-версии у каждой главы внизу есть раздел комментариев. Рекомендуется уделять внимание его содержанию. С одной стороны, это поможет увидеть, с какими трудностями сталкиваются другие читатели, восполнить пробелы и подтолкнуть себя к более глубокому пониманию. С другой стороны, мы надеемся, что вы будете отвечать на вопросы других участников и делиться своими мнениями.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-7 Пример раздела комментариев </p>
|
|
|
|
## 0.2.5 Дорожная карта изучения алгоритмов
|
|
|
|
В целом процесс изучения структур данных и алгоритмов можно разделить на три этапа.
|
|
|
|
1. **Этап 1: введение в алгоритмы**. Необходимо познакомиться с особенностями и применением различных структур данных, изучить принципы, процессы, назначение и эффективность различных алгоритмов.
|
|
2. **Этап 2: решение алгоритмических задач**. Рекомендуется начинать с популярных задач и решить не менее 100 из них, чтобы познакомиться с основными алгоритмическими проблемами. При первых попытках «забывание знаний» может стать испытанием, но это нормально. Следуйте при повторении задач «кривой забывания Эббингауза», и обычно после 3-5 циклов повторения материал хорошо запоминается. Рекомендуемые списки задач и планы практики см. в этом [репозитории GitHub](https://github.com/krahets/LeetCode-Book).
|
|
3. **Этап 3: построение системы знаний**. В процессе обучения можно читать статьи по алгоритмам, изучать каркасы решений и учебники, чтобы постоянно обогащать свою систему знаний. В решении задач можно применять продвинутые стратегии, например классификацию по темам, несколько решений одной задачи или одно решение для нескольких задач. Соответствующий опыт можно найти в различных сообществах.
|
|
|
|
Как показано на рисунке 0-8, содержание этой книги в основном охватывает «этап 1» и призвано помочь вам более эффективно перейти к обучению на этапах 2 и 3.
|
|
|
|
{ class="animation-figure" }
|
|
|
|
<p align="center"> Рисунок 0-8 Дорожная карта изучения алгоритмов </p>
|