First version.

This commit is contained in:
krahets
2026-01-20 15:08:42 +08:00
parent 2213a59ff6
commit 8071daddaa
106 changed files with 11790 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
# О книге
Этот проект задуман как открытое, бесплатное и дружелюбное к новичкам введение в структуры данных и алгоритмы.
- В книге используются анимационные иллюстрации. Материал изложен ясно и последовательно, что облегчает освоение и помогает начинающим построить «карту знаний» по структурам данных и алгоритмам.
- Исходный код можно запустить одним кликом, что позволяет тренироваться, развивать навыки программирования и формировать понимание принципов работы алгоритмов и реализации структур данных на фундаментальном уровне.
- Мы призываем к взаимопомощи читателей: задавайте вопросы и делитесь идеями в комментариях. Обсуждения помогают двигаться вперед всем вместе.
## Целевая аудитория
Если вы новичок в алгоритмах, никогда с ними не сталкивались или у вас есть некоторый опыт решения задач, но еще нет четкого понимания структур данных и алгоритмов, эта книга создана специально для вас!
Если у вас уже есть определенный опыт решения задач и вы знакомы с большинством типов задач, эта книга поможет вам освежить и систематизировать знания об алгоритмах. Исходный код может служить набором инструментов для решения задач или алгоритмическим словарем.
Если вы владеете алгоритмами на экспертном уровне, мы будем рады вашим ценным советам или совместному участию в создании книги.
!!! success "Предварительные условия"
Вам необходимо владеть основами программирования хотя бы на одном языке, уметь читать и писать простой код.
## Структура книги
Основное содержание книги представлено на рисунке ниже.
- **Анализ сложности**: критерии и методы оценки структур данных и алгоритмов. Методы расчета временной и пространственной сложности, распространенные типы, примеры и т. д.
- **Структуры данных**: классификация основных типов данных и структур данных. Определение, преимущества и недостатки, основные операции, распространенные типы, типичные приложения и методы реализации массивов, списков, стеков, очередей, хеш-таблиц, деревьев, куч, графов и т. д.
- **Алгоритмы**: определение, преимущества и недостатки, эффективность, области применения, этапы решения и примеры задач для поиска, сортировки, алгоритма «разделяй и властвуй», обратного поиска, динамического программирования, жадных алгоритмов и т. д.
![Основное содержание книги](../assets/media/image33.png)
## Благодарности
Эта книга постоянно совершенствуется благодаря совместным усилиям множества участников открытого сообщества. Благодарим каждого автора, вложившего свое время и силы. Имена перечислены в порядке, автоматически сгенерированном GitHub: krahets, coderonion, Gonglja, nuomi1, Reanon, justin-tse, hpstory, danielsss, curtishd, night-cruise, S-N-O-R-L-A-X, msk397, gvenusleo, khoaxuantu, RiverTwilight, rongyi, gyt95, zhuoqinyue, K3v123, Zuoxun, mingXta, hello-ikun, FangYuan33, GN-Yu, yuelinxin, longsizhuo, Cathay-Chen, guowei-gong, xBLACKICEx, IsChristina, JoseHung, qualifier1024, QiLOL, pengchzn, Guanngxu, L-Super, WSL0809, Slone123c, lhxsm, yuan0221, what-is-me, theNefelibatas, longranger2, cy-by-side, xiongsp, JeffersonHuang, Transmigration-zhou, magentaqin, Wonderdch, malone6, xiaomiusa87, gaofer, bluebean-cloud, a16su, Shyam-Chen, nanlei, hongyun-robot, Phoenix0415, MolDuM, Nigh, he-weilai, junminhong, mgisr, iron-irax, yd-j, XiaChuerwu, XC-Zero, seven1240, SamJin98, wodray, reeswell, NI-SW, Horbin-Magician, Enlightenus, xjr7670, YangXuanyi, DullSword, boloboloda, iStig, qq909244296, jiaxianhua, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, liuxjerry, lucaswangdev, lyl625760, hts0000, gledfish, fbigm, echo1937, szu17dmy, dshlstarr, Yucao-cy, coderlef, czruby, bongbongbakudan, beintentional, ZongYangL, ZhongYuuu, luluxia, xb534, bitsmi, ElaBosak233, baagod, zhouLion, yishangzhang, yi427, yabo083, weibk, wangwang105, th1nk3r-ing, tao363, 4yDX3906, syd168, steventimes, sslmj2020, smilelsb, siqyka, selear, sdshaoda, Xi-Row, popozhu, nuquist19, noobcodemaker, XiaoK29, chadyi, ZhongGuanbin, shanghai-Jerry, JackYanghellobobo, Javesun99, lipusheng, BlindTerran, ShiMaRing, FreddieLi, FloranceYeh, iFleey, fanchenggang, gltianwen, goerll, Dr-XYZ, nedchu, curly210102, CuB3y0nd, KraHsu, CarrotDLaw, youshaoXG, bubble9um, fanenr, eagleanurag, LifeGoesOnionOnionOnion, 52coder, foursevenlove, KorsChen, hezhizhen, linzeyan, ZJKung, GaochaoZhu, hopkings2008, yang-le, Evilrabbit520, Turing-1024-Lee, thomasq0, Suremotoo, Allen-Scai, Risuntsy, Richard-Zhang1019, qingpeng9802, primexiao, nidhoggfgg, 1ch0, MwumLi, martinx, ZnYang2018, hugtyftg, logan-qiu, psychelzh, Keynman, KeiichiKasai и 0130w.
Рецензирование кода книги выполнили coderonion, curtishd, Gonglja, gvenusleo, hpstory, justin-tse, khoaxuantu, krahets, night-cruise, nuomi1, Reanon и rongyi (в алфавитном порядке). Благодарим их за потраченное время и усилия, которые
+13
View File
@@ -0,0 +1,13 @@
# Введение
![](../assets/media/image31.jpeg){width="4.60417760279965in" height="5.958333333333333in"}
1. **О книге**
> Этот проект задуман как открытое, бесплатное и дружелюбное к новичкам введение в структуры данных и алгоритмы.
1. В книге используются анимационные иллюстрации. Материал изложен ясно и последовательно, что облегчает освоение и помогает начинаю- щим построить «карту знаний» по структурам данных и алгоритмам.
2. Исходный код можно запустить одним кликом, что позволяет трениро- ваться, развивать навыки программирования и формировать понима- ние принципов работы алгоритмов и реализации структур данных на фундаментальном уровне.
3. Мы призываем к взаимопомощи читателей: задавайте вопросы и дели- тесь идеями в комментариях. Обсуждения помогают двигаться вперед всем вместе.
+267
View File
@@ -0,0 +1,267 @@
# Как использовать эту книгу
!!! tip
Для получения наилучшего опыта чтения рекомендуется внимательно ознакомиться с содержанием этого раздела.
## Стиль изложения
- Главы, имеющие символ `*` после заголовка, являются дополнительными и содержат более сложный материал. Если у вас ограничено время, можно их пропустить.
- Профессиональные термины выделяются полужирным шрифтом (в печатной и 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=""
### Заголовочные комментарии, используются для обозначения функций, классов, тестовых примеров и т.д. ###
# Содержательные комментарии, используются для пояснения кода.
# Многострочные
# комментарии.
```
## Эффективное обучение с помощью анимированных иллюстраций
Видео и изображения обладают более высокой плотностью информации и структурированностью по сравнению с текстом, что облегчает понимание. В этой книге **ключевые и сложные моменты в основном представлены в виде анимированных иллюстраций**, а текстовая информация служит пояснением и дополнением.
Если какой-либо раздел в книге сопровождается анимационной иллюстрацией, как показано ниже, **используйте иллюстрацию в качестве основного источника информации, а текст -- в качестве вспомогательного**.
![Пример анимационной иллюстрации](../index.assets/animation.gif)
## Углубление понимания через практику с кодом
<!-- 🔴 Русская версия: отсутствует абзац о GitHub репозитории -->
<!-- 中文原文:本书的配套代码托管在 GitHub 仓库。如下图所示,**源代码附有测试样例,可一键运行**。 -->
<!-- 🔴 Русская версия: отсутствует абзац о рекомендации набирать код -->
<!-- 中文原文:如果时间允许,**建议你参照代码自行敲一遍**。如果学习时间有限,请至少通读并运行所有代码。 -->
<!-- 🔴 Русская версия: отсутствует абзац о пользе написания кода -->
<!-- 中文原文:与阅读代码相比,编写代码的过程往往能带来更多收获。**动手学,才是真的学**。 -->
<!-- 🔴 Русская версия: отсутствует изображение running_code.gif -->
<!-- 中文原文:![运行代码示例](../index.assets/running_code.gif) -->
<!-- 🔴 Русская версия: отсутствует абзац о трех шагах подготовки -->
<!-- 中文原文:运行代码的前置工作主要分为三步。 -->
<!-- 🔴 Русская версия: отсутствует описание первого шага -->
<!-- 中文原文:**第一步:安装本地编程环境**。请参照附录所示的[教程](https://www.hello-algo.com/chapter_appendix/installation/)进行安装,如果已安装,则可跳过此步骤。 -->
<!-- 🔴 Русская версия: отсутствует описание второго шага -->
<!-- 中文原文:**第二步:克隆或下载代码仓库**。前往 [GitHub 仓库](https://github.com/krahets/hello-algo)。如果已经安装 [Git](https://git-scm.com/downloads) ,可以通过以下命令克隆本仓库: -->
<!-- 🔴 Русская версия: отсутствует команда git clone -->
<!-- 中文原文:```shell git clone https://github.com/krahets/hello-algo.git ``` -->
<!-- 🔴 Русская версия: отсутствует абзац о скачивании ZIP -->
<!-- 中文原文:当然,你也可以在下图所示的位置,点击"Download ZIP"按钮直接下载代码压缩包,然后在本地解压即可。 -->
<!-- 🔴 Русская версия: отсутствует изображение download_code.png -->
<!-- 中文原文:![克隆仓库与下载代码](suggestions.assets/download_code.png) -->
<!-- 🔴 Русская версия: отсутствует описание третьего шага -->
<!-- 中文原文:**第三步:运行源代码**。如下图所示,对于顶部标有文件名称的代码块,我们可以在仓库的 `codes` 文件夹内找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内容。 -->
<!-- 🔴 Русская версия: отсутствует изображение code_md_to_repo.png -->
<!-- 中文原文:![代码块与对应的源代码文件](suggestions.assets/code_md_to_repo.png) -->
<!-- 🔴 Русская версия: отсутствует абзац о визуализации Python кода -->
<!-- 中文原文:除了本地运行代码,**网页版还支持 Python 代码的可视化运行**(基于 [pythontutor](https://pythontutor.com/) 实现)。如下图所示,你可以点击代码块下方的"可视化运行"来展开视图,观察算法代码的执行过程;也可以点击"全屏观看",以获得更好的阅览体验。 -->
<!-- 🔴 Русская версия: отсутствует изображение pythontutor_example.png -->
<!-- 中文原文:![Python 代码的可视化运行](suggestions.assets/pythontutor_example.png) -->
## Совместный рост через вопросы и обсуждения
<!-- 🔴 Русская версия: отсутствует абзац о не пропускании непонятного материала -->
<!-- 中文原文:在阅读本书时,请不要轻易跳过那些没学明白的知识点。**欢迎在评论区提出你的问题**,我和小伙伴们将竭诚为你解答,一般情况下可在两天内回复。 -->
<!-- 🔴 Русская версия: отсутствует абзац о комментариях внизу страниц -->
<!-- 中文原文:如下图所示,网页版每个章节的底部都配有评论区。希望你能多关注评论区的内容。一方面,你可以了解大家遇到的问题,从而查漏补缺,激发更深入的思考。另一方面,期待你能慷慨地回答其他小伙伴的问题,分享你的见解,帮助他人进步。 -->
<!-- 🔴 Русская версия: отсутствует изображение comment.gif -->
<!-- 中文原文:![评论区示例](../index.assets/comment.gif) -->
## Путь изучения алгоритмов
<!-- 🔴 Русская версия: отсутствует вводный абзац о трех этапах -->
<!-- 中文原文:从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 -->
<!-- 🔴 Русская версия: отсутствует описание этапа 1 -->
<!-- 中文原文:1. **阶段一:算法入门**。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面的内容。 -->
<!-- 🔴 Русская версия: отсутствует описание этапа 2 -->
<!-- 中文原文:2. **阶段二:刷算法题**。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题时,"知识遗忘"可能是一个挑战,但请放心,这是很正常的。我们可以按照"艾宾浩斯遗忘曲线"来复习题目,通常在进行 3~5 轮的重复后,就能将其牢记在心。推荐的题单和刷题计划请见此 [GitHub 仓库](https://github.com/krahets/LeetCode-Book)。 -->
<!-- 🔴 Русская версия: отсутствует описание этапа 3 -->
<!-- 中文原文:3. **阶段三:搭建知识体系**。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心得可以在各个社区找到。 -->
<!-- 🔴 Русская версия: отсутствует абзац о покрытии этапа 1 -->
<!-- 中文原文:如下图所示,本书内容主要涵盖"阶段一",旨在帮助你更高效地展开阶段二和阶段三的学习。 -->
<!-- 🔴 Русская версия: отсутствует изображение learning_route.png -->
<!-- 中文原文:![算法学习路线](suggestions.assets/learning_route.png) -->
+10
View File
@@ -0,0 +1,10 @@
# Резюме
### Основные моменты
- Основная аудитория этой книги -- начинающие изучать алгоритмы. Если у вас уже есть определенный опыт, эта книга поможет вам систематизировать знания об алгоритмах. Исходный код может служить набором инструментов для решения задач.
- Содержание книги включает три основные части: анализ сложности, структуры данных и алгоритмы, охватывая большинство тем в этой области.
- Для новичков в алгоритмах чтение вводной книги на начальном этапе обучения имеет решающее значение и может помочь избежать многих ошибок.
- Анимационные иллюстрации в книге обычно используются для представления ключевых и сложных моментов. При чтении книги следует уделять этим материалам больше внимания.
- Практика -- лучший способ изучения программирования. Настоятельно рекомендуется запускать исходный код и писать код самостоятельно.
- В веб-версии книги под каждой главой есть раздел комментариев, где вы можете в любое время делиться своими вопросами и идеями.