mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-07 11:36:46 +08:00
build
This commit is contained in:
60
ru/docs/chapter_preface/about_the_book.md
Normal file
60
ru/docs/chapter_preface/about_the_book.md
Normal file
@@ -0,0 +1,60 @@
|
||||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 0.1 Об этой книге
|
||||
|
||||
Этот проект направлен на создание открытого, бесплатного и дружелюбного к новичкам вводного пособия по структурам данных и алгоритмам.
|
||||
|
||||
- Вся книга построена на анимированных иллюстрациях: материал изложен ясно и последовательно, а кривая обучения остается плавной, помогая начинающим постепенно увидеть карту знаний по структурам данных и алгоритмам.
|
||||
- Исходный код можно запускать одним нажатием, что помогает читателю через практику развивать навыки программирования и понимать, как работают алгоритмы и как устроены структуры данных на базовом уровне.
|
||||
- Мы призываем читателей учиться друг у друга: задавайте вопросы и делитесь своими наблюдениями в комментариях, чтобы вместе продвигаться вперед через обсуждение и обмен идеями.
|
||||
|
||||
## 0.1.1 Целевая аудитория
|
||||
|
||||
Если ты только начинаешь изучать алгоритмы, никогда раньше с ними не сталкивался или уже решал некоторые задачи, но все еще смутно представляешь себе структуры данных и алгоритмы и постоянно колеблешься между "понимаю" и "не понимаю", то эта книга создана именно для тебя!
|
||||
|
||||
Если у тебя уже накопился определенный опыт решения задач и ты знаком с большинством типовых вопросов, книга поможет тебе системно повторить и упорядочить знания об алгоритмах, а исходный код из репозитория можно использовать как "инструментарий для решения задач" или как "алгоритмический словарь".
|
||||
|
||||
Если же ты уже настоящий "гуру" алгоритмов, мы будем рады получить твои ценные замечания или [создавать книгу вместе](https://www.hello-algo.com/chapter_appendix/contribution/).
|
||||
|
||||
!!! success "Предварительные требования"
|
||||
|
||||
Тебе нужна хотя бы базовая подготовка в одном из языков программирования, чтобы читать и писать простой код.
|
||||
|
||||
## 0.1.2 Структура содержания
|
||||
|
||||
Основное содержание книги показано на рисунке 0-1.
|
||||
|
||||
- **Анализ сложности**: измерения и методы оценки структур данных и алгоритмов. Способы вычисления временной и пространственной сложности, распространенные типы, примеры и т. д.
|
||||
- **Структуры данных**: способы классификации базовых типов данных и структур данных. Определения, достоинства и недостатки, основные операции, распространенные разновидности, типичные применения и методы реализации массивов, связных списков, стеков, очередей, хеш-таблиц, деревьев, куч, графов и других структур.
|
||||
- **Алгоритмы**: определения, достоинства и недостатки, эффективность, области применения, этапы решения и примеры задач для поиска, сортировки, разделяй-и-властвуй, поиска с возвратом, динамического программирования и жадных алгоритмов.
|
||||
|
||||
{ class="animation-figure" }
|
||||
|
||||
<p align="center"> Рисунок 0-1 Основное содержание книги </p>
|
||||
|
||||
## 0.1.3 Благодарности
|
||||
|
||||
Эта книга непрерывно совершенствуется благодаря совместным усилиям множества участников сообщества open source. Спасибо каждому автору, который вложил свое время и силы; их имена перечислены в порядке, автоматически сгенерированном GitHub: krahets, coderonion, Gonglja, nuomi1, Reanon, justin-tse, hpstory, danielsss, curtishd, night-cruise, S-N-O-R-L-A-X, rongyi, msk397, gvenusleo, khoaxuantu, rivertwilight, K3v123, gyt95, zhuoqinyue, yuelinxin, Zuoxun, mingXta, Phoenix0415, FangYuan33, GN-Yu, longsizhuo, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, pengchzn, QiLOL, magentaqin, hello-ikun, JoseHung, qualifier1024, thomasq0, sunshinesDL, L-Super, Guanngxu, Transmigration-zhou, WSL0809, Slone123c, lhxsm, yuan0221, what-is-me, Shyam-Chen, theNefelibatas, longranger2, codeberg-user, xiongsp, JeffersonHuang, prinpal, seven1240, Wonderdch, malone6, xiaomiusa87, gaofer, bluebean-cloud, a16su, SamJin98, hongyun-robot, nanlei, XiaChuerwu, yd-j, iron-irax, mgisr, steventimes, junminhong, heshuyue, danny900714, MolDuM, Nigh, Dr-XYZ, XC-Zero, reeswell, PXG-XPG, NI-SW, Horbin-Magician, Enlightenus, YangXuanyi, beatrix-chan, DullSword, xjr7670, jiaxianhua, qq909244296, iStig, boloboloda, hts0000, gledfish, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, linyejoe2, liuxjerry, llql1211, fbigm, echo1937, szu17dmy, dshlstarr, Yucao-cy, coderlef, czruby, bongbongbakudan, beintentional, ZongYangL, ZhongYuuu, ZhongGuanbin, hezhizhen, linzeyan, ZJKung, luluxia, xb534, ztkuaikuai, yw-1021, ElaBosak233, baagod, zhouLion, yishangzhang, yi427, yanedie, yabo083, weibk, wangwang105, th1nk3r-ing, tao363, 4yDX3906, syd168, sslmj2020, smilelsb, siqyka, selear, sdshaoda, Xi-Row, popozhu, nuquist19, noobcodemaker, XiaoK29, chadyi, lyl625760, lucaswangdev, 0130w, shanghai-Jerry, EJackYang, Javesun99, eltociear, lipusheng, KNChiu, BlindTerran, ShiMaRing, lovelock, FreddieLi, FloranceYeh, fanchenggang, gltianwen, goerll, nedchu, curly210102, CuB3y0nd, KraHsu, CarrotDLaw, youshaoXG, bubble9um, Asashishi, Asa0oo0o0o, fanenr, eagleanurag, akshiterate, 52coder, foursevenlove, KorsChen, GaochaoZhu, hopkings2008, yang-le, realwujing, Evilrabbit520, Umer-Jahangir, Turing-1024-Lee, Suremotoo, paoxiaomooo, Chieko-Seren, Allen-Scai, ymmmas, Risuntsy, Richard-Zhang1019, RafaelCaso, qingpeng9802, primexiao, Urbaner3, zhongfq, nidhoggfgg, MwumLi, CreatorMetaSky, martinx, ZnYang2018, hugtyftg, logan-qiu, psychelzh, Keynman, KeiichiKasai и KawaiiAsh.
|
||||
|
||||
Рецензирование кода для этой книги выполнили coderonion, curtishd, Gonglja, gvenusleo, hpstory, justin-tse, khoaxuantu, krahets, night-cruise, nuomi1, Reanon и rongyi (в алфавитном порядке). Спасибо им за время и силы: именно они обеспечили единообразие и стандартизацию кода на разных языках.
|
||||
|
||||
Традиционную китайскую версию книги вычитали Shyam-Chen и Dr-XYZ, английскую версию - yuelinxin, K3v123, QiLOL, Phoenix0415, SamJin98, yanedie, RafaelCaso, pengchzn, thomasq0 и magentaqin, а японскую версию - eltociear. Именно благодаря их постоянному вкладу эта книга может быть полезна более широкому кругу читателей, и мы искренне благодарим их.
|
||||
|
||||
Инструмент генерации ePub-версии этой книги разработал zhongfq. Благодарим его за вклад, который дал читателям более гибкий способ чтения.
|
||||
|
||||
Во время работы над этой книгой мне помогало очень много людей.
|
||||
|
||||
- Спасибо моему наставнику в компании, доктору Ли Си: в одной из бесед ты подтолкнул меня "быстрее начать", и это укрепило мою решимость написать эту книгу;
|
||||
- Спасибо моей девушке Bubble, первому читателю этой книги: с позиции новичка в алгоритмах ты дала много ценных замечаний, благодаря которым книга стала понятнее для начинающих;
|
||||
- Спасибо Tengbao, Qibao и Feibao за придуманное ими креативное название книги, которое возвращает нас к теплому воспоминанию о первой строке кода "Hello World!";
|
||||
- Спасибо Xiaoquan за профессиональную помощь по вопросам интеллектуальной собственности: она сыграла важную роль в совершенствовании этой открытой книги;
|
||||
- Спасибо Sutong за прекрасный дизайн обложки и логотипа, а также за терпеливые многочисленные правки, на которые тебя вдохновлял мой перфекционизм;
|
||||
- Спасибо @squidfunk за советы по верстке и за созданную им открытую тему документации [Material-for-MkDocs](https://github.com/squidfunk/mkdocs-material/tree/master).
|
||||
|
||||
Во время написания книги я прочитал множество учебников и статей по структурам данных и алгоритмам. Эти работы стали для книги прекрасными образцами и помогли обеспечить точность и качество материала. Я искренне благодарю всех преподавателей и предшественников за их выдающийся вклад!
|
||||
|
||||
Эта книга пропагандирует способ обучения, в котором работают и руки, и голова; в этом отношении на меня сильно повлияла [Dive into Deep Learning](https://github.com/d2l-ai/d2l-zh). Я горячо рекомендую эту замечательную работу всем читателям.
|
||||
|
||||
**От всего сердца благодарю моих родителей: именно ваша постоянная поддержка и ободрение дали мне возможность заниматься этим интересным делом**.
|
||||
20
ru/docs/chapter_preface/index.md
Normal file
20
ru/docs/chapter_preface/index.md
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
comments: true
|
||||
icon: material/book-open-outline
|
||||
---
|
||||
|
||||
# Глава 0. Предисловие
|
||||
|
||||
{ class="cover-image" }
|
||||
|
||||
!!! abstract
|
||||
|
||||
Алгоритмы подобны прекрасной симфонии, а каждая строка кода течет, как мелодия.
|
||||
|
||||
Пусть эта книга мягко зазвучит в твоем сознании и оставит после себя особую и глубокую мелодию.
|
||||
|
||||
## Содержание главы
|
||||
|
||||
- [0.1 Об этой книге](about_the_book.md)
|
||||
- [0.2 Как пользоваться этой книгой](suggestions.md)
|
||||
- [0.3 Резюме](summary.md)
|
||||
259
ru/docs/chapter_preface/suggestions.md
Normal file
259
ru/docs/chapter_preface/suggestions.md
Normal file
@@ -0,0 +1,259 @@
|
||||
---
|
||||
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). Как показано ниже, **исходный код снабжен тестовыми примерами и может запускаться одним нажатием**.
|
||||
|
||||
Если позволяет время, **рекомендуется самостоятельно перепечатать код**. Если времени на обучение мало, то хотя бы полностью прочитай и запусти весь код.
|
||||
|
||||
По сравнению с простым чтением кода сам процесс его написания обычно дает больше пользы. **Учиться на практике - значит учиться по-настоящему**.
|
||||
|
||||
{ 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/)). Как показано ниже, можно нажать "Визуализировать выполнение" под блоком кода, чтобы раскрыть окно и наблюдать за выполнением алгоритма; также можно нажать "Полноэкранный режим", чтобы получить более удобный просмотр.
|
||||
|
||||
{ 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>
|
||||
14
ru/docs/chapter_preface/summary.md
Normal file
14
ru/docs/chapter_preface/summary.md
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 0.3 Резюме
|
||||
|
||||
### 1. Ключевые выводы
|
||||
|
||||
- Основная аудитория этой книги - новички в изучении алгоритмов. Если у тебя уже есть определенная база, книга поможет системно повторить знания, а исходный код можно использовать как "инструментарий для решения задач".
|
||||
- Основное содержание книги состоит из трех частей: анализ сложности, структуры данных и алгоритмы; вместе они охватывают большую часть тем этой области.
|
||||
- Для начинающих особенно важно на старте прочитать хорошее вводное пособие: это помогает избежать множества лишних обходных путей.
|
||||
- Анимированные иллюстрации в книге обычно используются для объяснения ключевых и сложных идей. При чтении книги этим материалам стоит уделять больше внимания.
|
||||
- Практика - лучший способ изучать программирование. Настоятельно рекомендуется запускать исходный код и набирать его самостоятельно.
|
||||
- В веб-версии книги у каждой главы есть раздел комментариев, где можно в любой момент делиться вопросами и своими мыслями.
|
||||
Reference in New Issue
Block a user