Skip to content

Commit 7cd83ea

Browse files
committed
使用 mkdocs 制作电子书
1 parent 6fbbceb commit 7cd83ea

File tree

20 files changed

+289
-35
lines changed

20 files changed

+289
-35
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ Session.vim
2222
.cache
2323
.tmp
2424
.idea
25+
26+
# mkdocs
27+
site/

6_算法分析/big_o.md

Lines changed: 0 additions & 31 deletions
This file was deleted.

README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
## 痛点
99
- 讲 Python 数据结构和算法的资料很少,中文资料更少
1010
- 很多自学 Python 的工程师对基础不够重视,面试也发现很多数据结构和算法不过关,太多人挂在了基础的数据结构和算法上
11-
- 缺少工程应用场景下的讲解,很多讲算法的资料太『教科书化』
12-
- 很多培训班出来的同学或者自学的同学数据结构和算法比较薄弱,面试笔试很吃亏
11+
- 缺少工程应用场景下的讲解,很多讲算法的资料太『教科书化』。本书实现的代码工程上可用
1312

1413
## 作者简介
1514
目前就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities),从实习期间接触 Python 起一直从事 Python 网站后端开发,有一定 Python 的使用和实践经验。
@@ -74,7 +73,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
7473
- 掌握 Python 基本语法,有过使用 Python 的经验。知道 class、module、yield 等
7574
- 基本的面向对象编程知识,会定义和使用 Python 中的类 (class)
7675
- 知道 Python 中的魔术方法,比如 `__len__` `__contains__`
77-
- 无需太多数学基础,仅在算法时间复杂度分析的时候会用到一些简单数学知识
76+
- 无需太多数学基础,仅在算法时间复杂度分析的时候会用到一些简单数学知识。对于学习基础算法,逻辑思维可能更重要一些
7877

7978
## 教材
8079
这里我参考过三本书:
@@ -159,3 +158,20 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
159158
文字内容讲义放到 github 上,供大家免费查阅。
160159

161160
如果你觉得文字内容或者视频内容有错误,欢迎在 github 上提 issue 讨论,我会修正相关内容,防止产生误导。
161+
162+
163+
## 本电子书制作和写作方式
164+
使用 mkdocs 和 markdown 构建,使用 Python-Markdown-Math 完成数学公式
165+
166+
安装依赖:
167+
```sh
168+
pip install mkdocs # 制作电子书
169+
# https://stackoverflow.com/questions/27882261/mkdocs-and-mathjax/31874157
170+
pip install https://github.com/mitya57/python-markdown-math/archive/master.zip
171+
```
172+
173+
编写并查看:
174+
```sh
175+
mkdocs serve # 修改自动更新,http://localhost:8000 访问
176+
```
177+
File renamed without changes.

3_链表/linked_list.md renamed to docs/3_链表/linked_list.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ class LinkedList(object):
3131
[root] -> [node0] -> [node1] -> [node2]
3232
"""
3333
```
34-
实现我们会在视频中用画图来模拟并且手动代码实现,代码里我们会标识每个步骤的时间复杂度.
34+
实现我们会在视频中用画图来模拟并且手动代码实现,代码里我们会标识每个步骤的时间复杂度。这里请高度集中精力,
35+
虽然链表的思想很简单,但是想要正确写对链表的操作代码可不容易,稍不留神就可能丢失一些步骤。
36+
这里我们还是会用简单的单测来验证代码是否按照预期工作。
3537

3638
来看下时间复杂度:
3739

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

docs/6_算法分析/big_o.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# 算法复杂度分析
2+
前面我们说了很多次时间复杂度是 O(1), O(n) 啥的,并没有仔细讲解这个 O 符号究竟是什么。
3+
你可以大概理解为操作的次数和数据个数的比例关系。比如 O(1) 就是有限次数操作,O(n) 就是操作正比于你的元素个数。
4+
这一章我们用更严谨的方式来定义它。
5+
6+
7+
# 大 O 表示法
8+
我们从一个计算矩阵的例子来引入,这里我参考了 [《Data Structures and Algorithms in Python》](
9+
https://book.douban.com/subject/10607365/) 中给的一个例子:
10+
11+
考虑计算一个 n * n 矩阵所有元素的和(如果你不知道矩阵,就理解为一个二维数组):
12+
13+
[0, 1, 2]
14+
[3, 4, 5]
15+
[6, 7, 8]
16+
17+
这里列举两种方式:
18+
19+
```py
20+
# version1
21+
total_sum = 0
22+
for i in range(n):
23+
row_sum[i] = 0
24+
for j in range(n):
25+
row_sum[i] = row_sum[i] + matrix[i, j]
26+
total_sum = total_sum + matrix[i, j]
27+
28+
# version2
29+
total_sum = 0
30+
for i in range(n):
31+
row_sum[i] = 0
32+
for j in range(n):
33+
row_sum[i] = row_sum[i] + matrix[i, j]
34+
total_sum = total_sum + row_sum[i] # 注意这里和上边的不同
35+
```
36+
37+
v1 版本的关键操作在 j 循环里,两步加法操作,由于嵌套在第一个循环里,操作步骤是 $(2n) * n = 2n^2$。
38+
v2 版本的 total_sum 只有 n 次操作,它的操作次数是 n + n*n = n^2 + n
39+
40+
41+
这里你可能还感觉不到它们有多大差别,因为计算机执行的太快了,但是当 n 增长特别快的时候,总的操作次数差距就很明显了:
42+
43+
n | 2n^2 | n^2 +n |
44+
-------|----------------|----------------|
45+
10 | 200 | 110 |
46+
100 | 20,000 | 10,100 |
47+
1000 | 2,000,000 | 1,001,000 |
48+
10000 | 200,000,000 | 100,010,000 |
49+
100000 | 20,000,000,000 | 10,000,100,000 |
50+
51+
52+
$$ x^{y^z}=(1+{\rm e}^x)^{-2xy^w} $$
53+
54+
# 时间复杂度
55+
56+
57+
# 空间复杂度
58+
相比时间复杂度,空间复杂度讨论比较少。因为用户老爷等不及,况且现在存储越来越白菜价了,更多时候我们为了提升响应速度宁可多 使用点空间。
59+
空间复杂度相对好算一些,就是每个元素的空间占用乘以总的元素数,有些算法需要额外的空间存储,有些可以本地解决。
60+
如果能本地搞定的我们成为 in place 的,原地操作,比如交换一个 数组中的某两个位置的元素。但是有些操作可能就需要申请额外的空间
61+
来完成算法了,后边我们介绍排序算法的时候会讲到。
62+
63+
64+
# 常见复杂度增长趋势图
65+
为了让你有个直观的感觉,我们来看看一些经典的时间复杂度和对应的增长趋势图。
66+
67+
68+
# 时间换空间,空间换时间
69+
有一些时候时间和空间两者不可兼得,我们会牺牲其中之一来换取另一个。
70+
空间换时间:比如典型的就是 python 中的集合(后面会讲到它的实现原理),虽然它比较浪费空间,但是却能用 O(1)
71+
的时间复杂度来判重。
72+
73+
时间换空间:当我们空间不够用,典型的就是缓存失效算法,我们不可能缓存下无限容量的数据,就会使用一些缓存淘汰算法来保证空间可用。
74+
75+
76+
# 思考题
77+
- 回头看看前几章我们讲到的数据结构,以及每个操作的时间复杂度,你能理解了吗?
78+
- 二分查找是针对有序元素的一种经典的查找算法,你知道的它的时间复杂度吗?你能简单证明下吗。
79+
- 斐波那契数列你肯定很熟悉,它的公式是 F(n) = F(n-1) + F(n-2),你知道计算一个斐波那契数 F(n)
80+
的时间复杂度吗?你会用数学公式证明吗?
81+
- 你能指出时间和空间权衡的例子吗?往往很多高效的数据结构能同时兼顾时间和空间复杂度,但是有时候我们却得做出一定的权衡
82+
83+
# 参考资料
84+
如果你对数学感兴趣,建议你阅读《算法导论》『函数的增长』这一节。
85+
和《Data Structures and Algorithms in Python》第4章。
86+
87+
88+
(本章我用了 [MathJax](https://www.zybuluo.com/codeep/note/163962) 来书写一些简单的数学公式,使用 "$"包含起来的就是数学公式)

docs/index.md

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
# Python 算法与数据结构视频教程
2+
3+
## 课程简介
4+
数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛。目前关于 Python 算法和数据结构的中文资料比较欠缺,
5+
笔者尝试录制视频教程帮助 Python 初学者掌握常用算法和数据结构,提升开发技能。
6+
本教程是付费教程(文字内容和代码免费),因为笔者录制的过程中除了购买软件、手写板等硬件之外,业余需要花费很多时间和精力来录制视频、查资料、编写课件和代码,养家糊口不容易,希望大家体谅。
7+
8+
## 痛点
9+
- 讲 Python 数据结构和算法的资料很少,中文资料更少
10+
- 很多自学 Python 的工程师对基础不够重视,面试也发现很多数据结构和算法不过关,太多人挂在了基础的数据结构和算法上
11+
- 缺少工程应用场景下的讲解,很多讲算法的资料太『教科书化』。本书实现的代码工程上可用
12+
13+
## 作者简介
14+
目前就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities),从实习期间接触 Python 起一直从事 Python 网站后端开发,有一定 Python 的使用和实践经验。
15+
16+
知乎专栏:
17+
- [《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
18+
- [《玩转vim(视频)》](https://zhuanlan.zhihu.com/vim-video)
19+
20+
电子书:[《Python web 入坑指南》](http://python-web-guide.readthedocs.io/zh/latest/<Paste>)
21+
22+
## 课程内容
23+
包括我们在业务开发和面试中常用的算法和数据结构,希望可以帮助新人快速上手,很多老手写业务代码写多了很多基础知识忘记了,
24+
也可以作为回顾。课程尽量用通俗的方式讲解,结合 python 语言和日常开发实践的经验,让没有太多基础和非科班的同学也能够理解。
25+
对于每个算法和用到的数据结构我们需要知道:
26+
27+
- 原理
28+
- Python 实现方式
29+
- 时间、空间复杂度
30+
- 使用场景,什么时候用
31+
32+
## 目录结构
33+
这里讲解的章节我参考了下边教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进。因为实现一些高级数据结构的时候会用到
34+
很多底层数据结构,防止跳跃太大导致读者理解困难。
35+
36+
课程的目录结构如下,每一章都有配套的文字讲义(markdown),示例代码,视频讲解,详细的讲解一般会放在视频里,使用手写板来
37+
进行板书,包括文字、图示、手动模拟算法过程等。
38+
39+
- 课程介绍
40+
- 课程简介之笨方法学算法
41+
- 抽象数据类型 ADT,面向对象编程
42+
- 数组和列表
43+
- 链表,高级链表。双链表,循环双端链表
44+
- 队列,双端队列,循环双端队列
45+
- 栈,栈溢出
46+
- 算法分析,时间复杂度 大O 表示法
47+
- 哈希表,散列冲突
48+
- 字典
49+
- 集合
50+
- 递归
51+
- 查找:线性查找和二分查找
52+
- 基本排序算法
53+
- 高级排序算法: 归并排序、堆排序、快排
54+
- 树,二叉树
55+
- 图,dfs 和 bfs
56+
- python 内置常用数据结构和算法的使用。list, dict, set, collections 模块,heapq 模块
57+
- 面试笔试常考算法
58+
59+
## 编程语言
60+
我们这里使用最近很火的Python。Python 入门简单而且是个多面手,在爬虫、web 后端、运维、数据分析、AI 方面领域都有 Python 的身影。
61+
知乎、豆瓣、头条、饿了么、搜狐等公司都有广泛使用 Python。笔者日常工作使用也是 Python,有一定实践经验,
62+
在知乎上维护了一个专栏[《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
63+
64+
Python 抽象程度比较高, 我们能用更少的代码来实现功能,同时不用像 C/C++ 那样担心内存管理、指针操作等底层问题,
65+
把主要心思放在算法逻辑本身而不是语言细节上,Python 也号称伪代码语言。所有代码示例使用 Python2/3 兼容代码,
66+
不过只在 python3.5 下测试过,推荐用相同版本 Python。
67+
68+
## 受众
69+
想要学习 Python 算法和数据结构的初、中级同学,包括自学的同学和本科低年级学生等。需要掌握 Python
70+
的基本语法和面向对象编程的一些概念,我们这里只使用最基本的 Python 语法,不会再去介绍用到的 Python 语法糖。
71+
72+
# 预备知识
73+
- 掌握 Python 基本语法,有过使用 Python 的经验。知道 class、module、yield 等
74+
- 基本的面向对象编程知识,会定义和使用 Python 中的类 (class)
75+
- 知道 Python 中的魔术方法,比如 `__len__` `__contains__`
76+
- 无需太多数学基础,仅在算法时间复杂度分析的时候会用到一些简单数学知识。对于学习基础算法,逻辑思维可能更重要一些
77+
78+
## 教材
79+
这里我参考过三本书:
80+
81+
[《算法图解》](https://book.douban.com/subject/26979890/): 图解的形式很适合新手,示例使用的是 python
82+
83+
[《Data Structures and Algorithms in Python》]( https://book.douban.com/subject/10607365/): 适合对 Python
84+
和算法比较熟悉的同学,或者是有其他语言编程经验的同学。英文版,缺点是书中错误真的很多,代码有些无法运行
85+
86+
[《算法导论》]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
87+
88+
89+
## 讲课形式
90+
91+
绘图演示+手写板+现场编码
92+
93+
我将使用绘图软件+手写板进行类似于纸笔形式的讲解,边讲边开个终端分成两个窗口,一个用 vim
94+
编写代码,另一个窗口用来运行代码,所有代码我将会现场编写(还是很有挑战的),不会像某些大学教师一样只喜欢念 ppt。
95+
每个视频我会尽量控制时长,讲的内容尽量通俗易懂,摆脱学院派的授课方式。
96+
97+
你可以参考我在知乎发的专栏文章看下:
98+
99+
[那些年,我们一起跪过的算法题[视频]](https://zhuanlan.zhihu.com/p/35175401)
100+
101+
[抱歉,我是开发,你居然让我写单测[视频]](https://zhuanlan.zhihu.com/p/35352024)
102+
103+
104+
## 课程特点
105+
106+
- 每个算法和数据结构都有讲义、视频(包含讲解、图示、手动模拟)、源代码。其中只有视频内容为付费内容
107+
- 讲义循序渐进,结合自己的学习和使用经验讲解。github 上实时更新
108+
- 视频演示更加直观易懂
109+
- 演示代码实现思路,所有代码在视频里均现场编写
110+
- 偏向工程应用和代码实现。代码直接可以用。每个文件都是自包含的,你可以直接运行和调试,这是目前大部分书籍做得不到位的地方
111+
- 良好的工程实践:[编码之前碎碎念(工程实践)](http://python-web-guide.readthedocs.io/zh/latest/codingstyle/codingstyle.html)
112+
这是很多看了几本书没有太多业界实践经验就敢讲课的培训班老师教不了的。**知识廉价,经验无价**
113+
- 每个实现都会有单测来验证,培养良好的编码和测试习惯,传授工程经验
114+
- 结合 cpython 底层实现讲解(比如list 内存分配策略等),避免一些使用上的坑。并且会用 python 来模拟内置 dict 等的实现
115+
- 每篇讲义后有思考题和延伸阅读链接,帮助大家加深思考和理解
116+
117+
## 资料
118+
119+
- 视频。包含所有讲解视频
120+
- 代码示例。所有代码我会放到 github 上
121+
- markdown 讲义,包含视频内容的提要等内容
122+
- 延伸阅读。我会附上一些阅读资料方便想深入学习的同学
123+
124+
## 如何学习
125+
笔者讲课录制视频的过程也是自己再整理和学习的过程,录制视频之前需要参考很多资料
126+
希望对所讲到的内容,你能够
127+
128+
- 理解所讲的每个数据结构和算法的
129+
- 原理
130+
- Python 实现方式
131+
- 时间、空间复杂度
132+
- 使用场景,什么时候用
133+
- 自己尝试实现,如果抛开视频自己写起来有困难可以多看几次视频,一定要自己手动实现。很多面试可能会让手写
134+
- 每章讲义后边都会有我设计的几个小问题,最好能够回答上来。同时还有代码练习题,你可以挑战下自己的掌握程度。
135+
- 最好按照顺序循序渐进,每章都会有铺垫和联系
136+
137+
## 课程目标
138+
掌握基本的算法和数据结构原理,能独立使用 Python 语言实现,能在日常开发中灵活选用数据结构。
139+
对于找工作的同学提升面试成功率。
140+
141+
142+
143+
## 工具
144+
145+
推荐使用以下工具进行开发,如果使用编辑器最好装对 应 Python 插件:
146+
147+
- Pycharm
148+
- Sublime
149+
- Atom
150+
- Vscode
151+
- Vim
152+
153+
154+
## 勘误
155+
156+
输出其实也是一种再学习的过程,中途需要查看大量资料、编写讲义、视频录制、代码编写等,难免有疏漏之处。
157+
有出版社找过笔者想让我出书,一来自己对出书兴趣不大,另外感觉书籍相对视频不够直观,有错误也不能及时修改,打算直接把所有
158+
文字内容讲义放到 github 上,供大家免费查阅。
159+
160+
如果你觉得文字内容或者视频内容有错误,欢迎在 github 上提 issue 讨论,我会修正相关内容,防止产生误导。

mkdocs.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
site_name: Python 数据结构与算法视频教程
2+
theme: readthedocs
3+
extra_javascript:
4+
- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML
5+
6+
markdown_extensions:
7+
- mdx_math
8+
pages:
9+
- 课程简介: 'index.md'
10+
- 课程简介之本方法学算法: '0_课程简介之笨方法学算法/why_and_how_to_learn.md'
11+
- 抽象数据类型和面向对象编程: '1_抽象数据类型和面向对象编程/ADT_OOP.md'
12+
- 数组和列表: '2_数组和列表/array_and_list.md'
13+
- 链表: '3_链表/linked_list.md'
14+
- 队列: '4_队列/queue.md'
15+
- : '5_栈/stack.md'
16+
- 算法分析: '6_算法分析/big_o.md'

0 commit comments

Comments
 (0)