hello-algo/docs/chapter_preface/about_the_book.md
2023-01-05 01:39:22 +08:00

244 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
comments: true
---
# 关于本书
五年前发生的一件事,成为了我职业生涯的重要转折点。当时的我在交大读研,对互联网求职一无所知,但仍然硬着头皮申请了 Microsoft 软件工程师实习。面试官让我在白板上写出“快速排序”代码,我畏畏缩缩地写了一个“冒泡排序”,并且还写错了` (ToT) ` 。从面试官的表情上,我看到了一个大大的 "GG" 。
此次失利倒逼我开始刷算法题。我采用“扫雷游戏”式的学习方法,两眼一抹黑刷题,扫到不会的“雷”就通过查资料把它“排掉”,配合周期性总结,逐渐形成了数据结构与算法的知识图景。幸运地,我在秋招斩获了多家大厂的 Offer 。
回想自己当初在“扫雷式”刷题中被炸的满头包的痛苦,思考良久,我意识到一本“前期刷题必看”的读物可以使算法小白少走许多弯路。写作意愿滚滚袭来,那就动笔吧:
<h4 align="center"> Hello算法 </h4>
## 读者对象
!!! success "前置条件"
您需要至少具备任一语言的编程基础,能够阅读和编写简单代码。
如果您是 **算法初学者**,完全没有接触过算法,或者已经有少量刷题,对数据结构与算法有朦胧的理解,在会与不会之间反复横跳,那么这本书就是为您而写!本书能够带来:
- 了解刷题所需的 **数据结构**,包括常用操作、优势和劣势、典型应用、实现方法等。
- 学习各类 **算法**,介绍算法的设计思想、运行效率、优势劣势、实现方法等。
- 可一键运行的 **配套代码**,包含详细注释,帮助你通过实践加深理解。
如果您是 **算法熟练工**,已经积累一定刷题量,接触过大多数题型,那么本书内容对你来说可能稍显基础,但仍能够带来以下价值:
- 本书篇幅不长,可以帮助你提纲挈领地回顾算法知识。
- 书中包含许多对比性、总结性的算法内容,可以帮助你梳理算法知识体系。
- 源代码实现了各种经典数据结构和算法,可以作为“刷题工具库”来使用。
如果您是 **算法大佬**,请受我膜拜!希望您可以抽时间提出意见建议,或者[一起参与创作](https://www.hello-algo.com/chapter_preface/contribution/),帮助各位同学获取更好的学习内容,感谢!
## 内容结构
本书主要内容分为复杂度分析、数据结构、算法三个部分。
![mindmap](index.assets/mindmap.png)
<p align="center"> Fig. 知识点思维导图 </p>
### 复杂度分析
首先介绍数据结构与算法的评价维度、算法效率的评估方法,引出了计算复杂度概念。
接下来,从 **函数渐近上界** 入手,分别介绍了 **时间复杂度** 和 **空间复杂度** ,包括推算方法、常见类型、示例等。同时,剖析了 **最差、最佳、平均** 时间复杂度的联系与区别。
### 数据结构
首先介绍了常用的 **基本数据类型** 、以及它们是如何在内存中存储的。
接下来,介绍了两种 **数据结构分类方法** ,包括逻辑结构与物理结构。
后续展开介绍了 **数组、链表、栈、队列、散列表、树、堆、图** 等数据结构,关心以下内容:
- 基本定义:数据结构的设计来源、存在意义;
- 主要特点:在各项数据操作中的优势、劣势;
- 常用操作:例如访问、更新、插入、删除、遍历、搜索等;
- 常见类型:在算法题或工程实际中,经常碰到的数据结构类型;
- 典型应用:此数据结构经常搭配哪些算法使用;
- 实现方法:对于重要的数据结构,将给出完整的实现示例;
### 算法
包括 **查找算法、排序算法、搜索与回溯、动态规划、分治算法**,内容包括:
- 基本定义:算法的设计思想;
- 主要特点:使用前置条件、优势和劣势;
- 算法效率:最差和平均时间复杂度、空间复杂度;
- 实现方法:完整的算法实现,以及优化措施;
- 示例题目:结合例题加深理解;
## 配套代码
完整代码托管在 [GitHub 仓库](https://github.com/krahets/hello-algo) ,皆可一键运行。
!!! tip "前置工作"
1. [编程环境安装](https://www.hello-algo.com/chapter_preface/installation/) ,若有请跳过
2. 代码下载与使用方法请见 [如何使用本书](https://www.hello-algo.com/chapter_preface/suggestions/#_4)
## 风格约定
- 标题后标注 * 符号的是选读章节,如果你的时间有限,可以先跳过这些章节。
- 文章中的重要名词会用「」符号标注,例如「数组 Array」。名词混淆会导致不必要的歧义因此最好可以记住这类名词包括中文和英文以便后续阅读文献时使用。
- 重点内容、总起句、总结句会被 **加粗** ,此类文字值得特别关注。
- 专有名词和有特指含义的词句会使用 “ ” 标注,以避免歧义。
- 在工程应用中,每种语言都有注释规范;而本书放弃了一部分的注释规范性,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注释、内容注释、多行注释。
=== "Java"
```java title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "C++"
```cpp title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "Python"
```python title=""
""" 标题注释,用于标注函数、类、测试样例等 """
# 内容注释,用于详解代码
"""
多行
注释
"""
```
=== "Go"
```go title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "JavaScript"
```js title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "TypeScript"
```typescript title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "C"
```c title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
=== "C#"
```csharp title=""
/* 标题注释,用于标注函数、类、测试样例等 */
// 内容注释,用于详解代码
/**
* 多行
* 注释
*/
```
"""
在 Java, C, C++, C#, Go, JS, TS 的代码注释中,`/* ... */` 用于注释函数、类、测试样例等标题, `// ...` 用于解释代码内容;类似地,在 Python 中,`""" ... """` 用于注释标题, `# ...` 用于解释代码。
## 本书特点 *
??? abstract "默认折叠,可以跳过"
**以实践为主。** 我们知道,学习英语期间光啃书本是远远不够的,需要多听、多说、多写,在实践中培养语感、积累经验。编程语言也是一门语言,因此学习方法也应是类似的,需要多看优秀代码、多敲键盘、多思考代码逻辑。
本书的理论部分占少量篇幅,主要分为两类:一是基础且必要的概念知识,以培养读者对于算法的感性认识;二是重要的分类、对比或总结,这是为了帮助你站在更高视角俯瞰各个知识点,形成连点成面的效果。
实践部分主要由示例和代码组成。代码配有简要注释,复杂示例会尽可能地使用视觉化的形式呈现。我强烈建议读者对照着代码自己敲一遍,如果时间有限,也至少逐行读、复制并运行一遍,配合着讲解将代码吃透。
**视觉化学习。** 信息时代以来,视觉化的脚步从未停止。媒体形式经历了文字短信、图文 Email 、动图、短(长)视频、交互式 Web 、3D 游戏等演变过程信息的视觉化程度越来越高、愈加符合人类感官、信息传播效率大大提升。科技界也在向视觉化迈进iPhone 就是一个典型例子,其相对于传统手机是高度视觉化的,包含精心设计的字体、主题配色、交互动画等。
近两年,短视频成为最受欢迎的信息媒介,可以在短时间内将高密度的信息“灌”给我们,有着极其舒适的观看体验。阅读则不然,读者与书本之间天然存在一种“疏离感”,我们看书会累、会走神、会停下来想其他事、会划下喜欢的句子、会思考某一片段的含义,这种疏离感给了读者与书本之间对话的可能,拓宽了想象空间。
本书作为一本入门教材,希望可以保有书本的“慢节奏”,但也会避免与读者产生过多“疏离感”,而是努力将知识完整清晰地推送到你聪明的小脑袋瓜中。我将采用视觉化的方式(例如配图、动画),尽我可能清晰易懂地讲解复杂概念和抽象示例。
**内容精简化。** 大多数的经典教科书,会把每个主题都讲的很透彻。虽然透彻性正是其获得读者青睐的原因,但对于想要快速入门的初学者来说,这些教材的实用性不足。本书会避免引入非必要的概念、名词、定义等,也避免展开不必要的理论分析,毕竟这不是一本真正意义上的教材,主要任务是尽快地带领读者入门。
引入一些生活案例或趣味内容,非常适合作为知识点的引子或者解释的补充,但当融入过多额外元素时,内容会稍显冗长,也许反而使读者容易迷失、抓不住重点,这也是本书需要避免的。
敲代码如同写字,“美”是统一的追求。本书力求美观的代码,保证规范的变量命名、统一的空格与换行、对齐的缩进、整齐的注释等。
## 致谢
本书的成书过程中,我获得了许多人的帮助,包括但不限于:
- 感谢我的女朋友泡泡担任本书的首位读者,从算法小白的视角为本书的写作提出了许多建议,使这本书更加适合算法初学者来阅读。
- 感谢腾宝、琦宝、飞宝为本书起了个响当当的名字,好听又有梗,直接唤起我最初敲下第一行代码 "Hello, World!" 的回忆。
- 感谢我的导师李博,在小酌畅谈时您告诉我“觉得适合、想做就去做”,坚定了我写这本书的决心。
- 感谢苏潼为本书设计了封面和 LOGO ,我有些强迫症,前后多次修改,谢谢你的耐心。
- 感谢 @squidfunk ,包括 [Material-for-MkDocs](https://github.com/squidfunk/mkdocs-material/tree/master) 顶级开源项目以及给出的写作排版建议。
在写作过程中,我阅读了许多与数据结构与算法的书籍材料,学习到了许多知识,感谢前辈们的精彩创作。
感谢父母,你们一贯的支持与鼓励给了我自由度来做这些有趣的事。
## 作者简介
![profile](about_the_book.assets/profile.png){: .center}
<h2 align="center"> Krahets </h2>
<h5 align="center"> 大厂高级算法工程师、算法爱好者 </h5>
<p align="center"> 力扣LeetCode全网阅读量最高博主 </p>
<p align="center"> 分享近百道算法题解,累积回复数千读者的评论问题 </p>
<p align="center"> 创作 LeetBook《图解算法数据结构》已免费售出 22 万本 </p>