mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-24 20:16:06 +00:00
First version.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# О книге
|
||||
|
||||
Этот проект задуман как открытое, бесплатное и дружелюбное к новичкам введение в структуры данных и алгоритмы.
|
||||
|
||||
- В книге используются анимационные иллюстрации. Материал изложен ясно и последовательно, что облегчает освоение и помогает начинающим построить «карту знаний» по структурам данных и алгоритмам.
|
||||
- Исходный код можно запустить одним кликом, что позволяет тренироваться, развивать навыки программирования и формировать понимание принципов работы алгоритмов и реализации структур данных на фундаментальном уровне.
|
||||
- Мы призываем к взаимопомощи читателей: задавайте вопросы и делитесь идеями в комментариях. Обсуждения помогают двигаться вперед всем вместе.
|
||||
|
||||
## Целевая аудитория
|
||||
|
||||
Если вы новичок в алгоритмах, никогда с ними не сталкивались или у вас есть некоторый опыт решения задач, но еще нет четкого понимания структур данных и алгоритмов, эта книга создана специально для вас!
|
||||
|
||||
Если у вас уже есть определенный опыт решения задач и вы знакомы с большинством типов задач, эта книга поможет вам освежить и систематизировать знания об алгоритмах. Исходный код может служить набором инструментов для решения задач или алгоритмическим словарем.
|
||||
|
||||
Если вы владеете алгоритмами на экспертном уровне, мы будем рады вашим ценным советам или совместному участию в создании книги.
|
||||
|
||||
!!! success "Предварительные условия"
|
||||
|
||||
Вам необходимо владеть основами программирования хотя бы на одном языке, уметь читать и писать простой код.
|
||||
|
||||
## Структура книги
|
||||
|
||||
Основное содержание книги представлено на рисунке ниже.
|
||||
|
||||
- **Анализ сложности**: критерии и методы оценки структур данных и алгоритмов. Методы расчета временной и пространственной сложности, распространенные типы, примеры и т. д.
|
||||
- **Структуры данных**: классификация основных типов данных и структур данных. Определение, преимущества и недостатки, основные операции, распространенные типы, типичные приложения и методы реализации массивов, списков, стеков, очередей, хеш-таблиц, деревьев, куч, графов и т. д.
|
||||
- **Алгоритмы**: определение, преимущества и недостатки, эффективность, области применения, этапы решения и примеры задач для поиска, сортировки, алгоритма «разделяй и властвуй», обратного поиска, динамического программирования, жадных алгоритмов и т. д.
|
||||
|
||||

|
||||
|
||||
## Благодарности
|
||||
|
||||
Эта книга постоянно совершенствуется благодаря совместным усилиям множества участников открытого сообщества. Благодарим каждого автора, вложившего свое время и силы. Имена перечислены в порядке, автоматически сгенерированном 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 (в алфавитном порядке). Благодарим их за потраченное время и усилия, которые
|
||||
@@ -0,0 +1,13 @@
|
||||
# Введение
|
||||
|
||||
{width="4.60417760279965in" height="5.958333333333333in"}
|
||||
|
||||
1. **О книге**
|
||||
|
||||
> Этот проект задуман как открытое, бесплатное и дружелюбное к новичкам введение в структуры данных и алгоритмы.
|
||||
|
||||
1. В книге используются анимационные иллюстрации. Материал изложен ясно и последовательно, что облегчает освоение и помогает начинаю- щим построить «карту знаний» по структурам данных и алгоритмам.
|
||||
|
||||
2. Исходный код можно запустить одним кликом, что позволяет трениро- ваться, развивать навыки программирования и формировать понима- ние принципов работы алгоритмов и реализации структур данных на фундаментальном уровне.
|
||||
|
||||
3. Мы призываем к взаимопомощи читателей: задавайте вопросы и дели- тесь идеями в комментариях. Обсуждения помогают двигаться вперед всем вместе.
|
||||
@@ -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=""
|
||||
### Заголовочные комментарии, используются для обозначения функций, классов, тестовых примеров и т.д. ###
|
||||
|
||||
# Содержательные комментарии, используются для пояснения кода.
|
||||
|
||||
# Многострочные
|
||||
# комментарии.
|
||||
```
|
||||
|
||||
## Эффективное обучение с помощью анимированных иллюстраций
|
||||
|
||||
Видео и изображения обладают более высокой плотностью информации и структурированностью по сравнению с текстом, что облегчает понимание. В этой книге **ключевые и сложные моменты в основном представлены в виде анимированных иллюстраций**, а текстовая информация служит пояснением и дополнением.
|
||||
|
||||
Если какой-либо раздел в книге сопровождается анимационной иллюстрацией, как показано ниже, **используйте иллюстрацию в качестве основного источника информации, а текст -- в качестве вспомогательного**.
|
||||
|
||||

|
||||
|
||||
## Углубление понимания через практику с кодом
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о GitHub репозитории -->
|
||||
<!-- 中文原文:本书的配套代码托管在 GitHub 仓库。如下图所示,**源代码附有测试样例,可一键运行**。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о рекомендации набирать код -->
|
||||
<!-- 中文原文:如果时间允许,**建议你参照代码自行敲一遍**。如果学习时间有限,请至少通读并运行所有代码。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о пользе написания кода -->
|
||||
<!-- 中文原文:与阅读代码相比,编写代码的过程往往能带来更多收获。**动手学,才是真的学**。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует изображение 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 -->
|
||||
<!-- 中文原文: -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует описание третьего шага -->
|
||||
<!-- 中文原文:**第三步:运行源代码**。如下图所示,对于顶部标有文件名称的代码块,我们可以在仓库的 `codes` 文件夹内找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内容。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует изображение code_md_to_repo.png -->
|
||||
<!-- 中文原文: -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о визуализации Python кода -->
|
||||
<!-- 中文原文:除了本地运行代码,**网页版还支持 Python 代码的可视化运行**(基于 [pythontutor](https://pythontutor.com/) 实现)。如下图所示,你可以点击代码块下方的"可视化运行"来展开视图,观察算法代码的执行过程;也可以点击"全屏观看",以获得更好的阅览体验。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует изображение pythontutor_example.png -->
|
||||
<!-- 中文原文: -->
|
||||
|
||||
## Совместный рост через вопросы и обсуждения
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о не пропускании непонятного материала -->
|
||||
<!-- 中文原文:在阅读本书时,请不要轻易跳过那些没学明白的知识点。**欢迎在评论区提出你的问题**,我和小伙伴们将竭诚为你解答,一般情况下可在两天内回复。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о комментариях внизу страниц -->
|
||||
<!-- 中文原文:如下图所示,网页版每个章节的底部都配有评论区。希望你能多关注评论区的内容。一方面,你可以了解大家遇到的问题,从而查漏补缺,激发更深入的思考。另一方面,期待你能慷慨地回答其他小伙伴的问题,分享你的见解,帮助他人进步。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует изображение comment.gif -->
|
||||
<!-- 中文原文: -->
|
||||
|
||||
## Путь изучения алгоритмов
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует вводный абзац о трех этапах -->
|
||||
<!-- 中文原文:从总体上看,我们可以将学习数据结构与算法的过程划分为三个阶段。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует описание этапа 1 -->
|
||||
<!-- 中文原文:1. **阶段一:算法入门**。我们需要熟悉各种数据结构的特点和用法,学习不同算法的原理、流程、用途和效率等方面的内容。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует описание этапа 2 -->
|
||||
<!-- 中文原文:2. **阶段二:刷算法题**。建议从热门题目开刷,先积累至少 100 道题目,熟悉主流的算法问题。初次刷题时,"知识遗忘"可能是一个挑战,但请放心,这是很正常的。我们可以按照"艾宾浩斯遗忘曲线"来复习题目,通常在进行 3~5 轮的重复后,就能将其牢记在心。推荐的题单和刷题计划请见此 [GitHub 仓库](https://github.com/krahets/LeetCode-Book)。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует описание этапа 3 -->
|
||||
<!-- 中文原文:3. **阶段三:搭建知识体系**。在学习方面,我们可以阅读算法专栏文章、解题框架和算法教材,以不断丰富知识体系。在刷题方面,可以尝试采用进阶刷题策略,如按专题分类、一题多解、一解多题等,相关的刷题心得可以在各个社区找到。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует абзац о покрытии этапа 1 -->
|
||||
<!-- 中文原文:如下图所示,本书内容主要涵盖"阶段一",旨在帮助你更高效地展开阶段二和阶段三的学习。 -->
|
||||
|
||||
<!-- 🔴 Русская версия: отсутствует изображение learning_route.png -->
|
||||
<!-- 中文原文: -->
|
||||
@@ -0,0 +1,10 @@
|
||||
# Резюме
|
||||
|
||||
### Основные моменты
|
||||
|
||||
- Основная аудитория этой книги -- начинающие изучать алгоритмы. Если у вас уже есть определенный опыт, эта книга поможет вам систематизировать знания об алгоритмах. Исходный код может служить набором инструментов для решения задач.
|
||||
- Содержание книги включает три основные части: анализ сложности, структуры данных и алгоритмы, охватывая большинство тем в этой области.
|
||||
- Для новичков в алгоритмах чтение вводной книги на начальном этапе обучения имеет решающее значение и может помочь избежать многих ошибок.
|
||||
- Анимационные иллюстрации в книге обычно используются для представления ключевых и сложных моментов. При чтении книги следует уделять этим материалам больше внимания.
|
||||
- Практика -- лучший способ изучения программирования. Настоятельно рекомендуется запускать исходный код и писать код самостоятельно.
|
||||
- В веб-версии книги под каждой главой есть раздел комментариев, где вы можете в любое время делиться своими вопросами и идеями.
|
||||
Reference in New Issue
Block a user