Skip to content

Commit b4078ca

Browse files
committed
Add '发' change to '發'
1 parent 7dce23c commit b4078ca

File tree

31 files changed

+130
-130
lines changed

31 files changed

+130
-130
lines changed

README.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
## 课程简介
44
數據結構和算法是每個程序员需要掌握的基础知识之一,也是面试中跨不過的槛。目前關于 Python 算法和數據結構的系统中文资料比较欠缺,
5-
笔者嘗試录制影片教程帮助 Python 開发者掌握常用算法和數據結構,提升開发技能
5+
笔者嘗試录制影片教程帮助 Python 開發者掌握常用算法和數據結構,提升開發技能
66
本教程是付费教程(文字内容和代碼免费),因為笔者录制的過程中除了购买软件、手写板等硬件之外,业余需要花费很多時間和精力來录制影片、查资料、编写课件和代碼,养家糊口不容易,希望大家體谅。
77

88
## 鏈接
9-
影片教程已經发布在网易云课堂和 csdn 学院,内容一致,推荐使用网易云课堂。
9+
影片教程已經發布在网易云课堂和 csdn 学院,内容一致,推荐使用网易云课堂。
1010

1111
[网易云课堂: Python數據結構与算法教程](http://study.163.com/course/introduction.htm?courseId=1005526003) 影片教程
1212

@@ -22,12 +22,12 @@
2222

2323
## 痛點
2424
- 講 Python 數據結構和算法的资料很少,中文资料更少
25-
- 很多自学 Python 的工程师對基础不够重视,面试也发现很多數據結構和算法不過關,很多人挂在了基础的數據結構和算法上
25+
- 很多自学 Python 的工程师對基础不够重视,面试也發现很多數據結構和算法不過關,很多人挂在了基础的數據結構和算法上
2626
- 缺少工程应用场景下的講解,很多講算法的资料太『教科书化』。本书實現的代碼工程上可用
2727
- 网上很多影片教程不够循序渐进,不成系统
2828

2929
## 作者简介
30-
曾就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities),任後端工程师,多年 Python 開发經验
30+
曾就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities),任後端工程师,多年 Python 開發經验
3131

3232
知乎专栏:
3333

@@ -37,8 +37,8 @@
3737
电子书:[《Python web 入坑指南》](http://python-web-guide.readthedocs.io/zh/latest/)
3838

3939
## 课程内容
40-
包括我們在业务開发和面试中常用的算法和數據結構,希望可以帮助 Python 開发者快速上手,很多老手写业务代碼写多了很多基础知识忘记了,
41-
也可以作為回顾。课程尽量用通俗的方式講解,結合 python 语言和日常開发实践的經验。书中代碼可以作為大家的面试笔试参考。
40+
包括我們在业务開發和面试中常用的算法和數據結構,希望可以帮助 Python 開發者快速上手,很多老手写业务代碼写多了很多基础知识忘记了,
41+
也可以作為回顾。课程尽量用通俗的方式講解,結合 python 语言和日常開發實践的經验。书中代碼可以作為大家的面试笔试参考。
4242
對于每個算法和用到的數據結構我們需要知道:
4343

4444
- 原理
@@ -47,7 +47,7 @@
4747
- 使用场景,什么时候用
4848

4949
## 目录結構
50-
這裡講解的章節我参考了下邊教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进,簡單实用。因為實現一些高级數據結構的时候會用到
50+
這裡講解的章節我参考了下邊教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进,簡單實用。因為實現一些高级數據結構的时候會用到
5151
很多底层數據結構,防止跳跃太大导致讀者理解困难。
5252

5353
课程的目录結構如下,每一章都有配套的文字講義(markdown),示例代碼,影片講解,详细的講解一般會放在影片里,使用手写板來
@@ -79,7 +79,7 @@
7979
## 编程语言
8080
我們這裡使用最近很火的Python。Python 入门簡單而且是個多面手,在爬虫、web 後端、运维、數據分析、AI、量化投资等领域都有 Python 的身影,
8181
无论是否是专业程序员, Python 都是一门学习性價比非常高的语言。
82-
知乎、豆瓣、头條、饿了么、搜狐等公司都有广泛使用 Python。笔者日常工作使用也是 Python,有一定实践經验
82+
知乎、豆瓣、头條、饿了么、搜狐等公司都有广泛使用 Python。笔者日常工作使用也是 Python,有一定實践經验
8383
在知乎上维护了一個专栏[《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
8484

8585
Python 抽象程度比较高, 我們能用更少的代碼來實現功能,同时不用像 C/C++ 那样担心内存管理、指針操作等底层問題,
@@ -89,12 +89,12 @@ Python 抽象程度比较高, 我們能用更少的代碼來實現功能,同
8989
## 受众
9090
想要学习 Python 算法和數據結構的中级同学,包括自学的同学和本科低年级学生等。需要掌握 Python
9191
的基本语法和面向對象编程的一些概念,有一定的 Python 使用經验。我們這裡尽量只使用最基本的 Python 语法,不會再去介绍用到的 Python 语法糖。
92-
數據結構和算法算是本科教育中偏难的课程,既需要你理解其原理,又需要具有有扎实的编程能力
92+
數據結構和算法算是本科教育中偏难的课程,既需要你理解其原理,又需要具有有扎實的编程能力
9393

9494
**請注意: 本教程不是零基础教程,着重于使用 Python 實現常用算法和數據結構,不适合从來没有学過算法和數據結構的新手同学,购买之前請慎重考虑,請确保你之前看過一本數據結構和算法的教材,最好有過其他语言實現算法的經验**
9595

9696
# 预备知识
97-
(注意:有些同学看起來很吃力,為了不花冤枉钱,我建議你先整體浏览本电子书的内容和代碼是否在自己的理解范围内,再决定是否购买影片。有些概念不是立马就能理解的,需要反复思考实践
97+
(注意:有些同学看起來很吃力,為了不花冤枉钱,我建議你先整體浏览本电子书的内容和代碼是否在自己的理解范围内,再决定是否购买影片。有些概念不是立马就能理解的,需要反复思考實践
9898

9999
- 了解基本的數據結構和算法的概念,不适合**完全**没有了解過算法的新手,更不适合 Python 基础都没掌握的同学。购买之前請慎重考虑
100100
- 无需太多数学基础,仅在算法時間複雜度分析的时候會用到一些簡單数学知识。對于学习基础算法,逻辑思维可能更重要一些
@@ -126,23 +126,23 @@ https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
126126
编写代碼,另一個窗口用來运行代碼,所有代碼我将會现场编写(還是很有挑战的)。
127127
每個影片我會尽量控制时长,講的内容尽量通俗易懂,摆脱学院派的授课方式。
128128

129-
你可以参考我在知乎发的专栏文章看下
129+
你可以参考我在知乎發的专栏文章看下
130130

131131
[那些年,我們一起跪過的算法题[影片]](https://zhuanlan.zhihu.com/p/35175401)
132132

133-
[抱歉,我是開发,你居然让我写單測[影片]](https://zhuanlan.zhihu.com/p/35352024)
133+
[抱歉,我是開發,你居然让我写單測[影片]](https://zhuanlan.zhihu.com/p/35352024)
134134

135135

136136
## 课程特點
137137

138138
- 每個算法和數據結構都有講義、影片(包含講解、图示、手動模擬)、源代碼。其中只有影片内容為付费内容
139-
- 講義循序渐进,結合自己的学习和使用經验講解。github 上实时更新
139+
- 講義循序渐进,結合自己的学习和使用經验講解。github 上實时更新
140140
- 影片演示更加直觀易懂
141141
- 演示代碼實現思路,所有代碼在影片里均现场编写
142142
- 偏向工程应用和代碼實現。代碼直接可以用。每個文件都是自包含的,你可以直接运行和调试,這是目前大部分书籍做得不到位的地方
143-
- 良好的工程实践[编碼之前碎碎念(工程实践)](http://python-web-guide.readthedocs.io/zh/latest/codingstyle/codingstyle.html)
144-
這是很多看了几本书没有太多业界实践經验就敢講课的培训班老师教不了的**知识廉價,經验无價**
145-
- 每個實現都會有單測來验证,培养良好的编碼和測试习惯,传授工程經验
143+
- 良好的工程實践[编碼之前碎碎念(工程實践)](http://python-web-guide.readthedocs.io/zh/latest/codingstyle/codingstyle.html)
144+
這是很多看了几本书没有太多业界實践經验就敢講课的培训班老师教不了的**知识廉價,經验无價**
145+
- 每個實現都會有單測來验证,培养良好的编碼和測试习惯,傳授工程經验
146146
- 結合 cpython 底层實現講解(比如list 内存分配策略等),避免一些使用上的坑。并且會用 python 來模擬内置 dict 等的實現
147147
- 每篇講義後有思考题和延伸閱讀鏈接,帮助大家加深思考和理解。大部分题目答案都可以网络上搜索到
148148

@@ -168,19 +168,19 @@ https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
168168
- Python 實現方式
169169
- 時間、空間複雜度
170170
- 使用场景,什么时候用
171-
- 自己嘗試實現,如果抛開影片自己写起來有困难可以反复多看几次影片,一定要自己手動實現。很多面试可能會让手写。一次不行就看完原理後多实践几次,直到能自己独立完成。
171+
- 自己嘗試實現,如果抛開影片自己写起來有困难可以反复多看几次影片,一定要自己手動實現。很多面试可能會让手写。一次不行就看完原理後多實践几次,直到能自己独立完成。
172172
- 每章講義後面都會有我设计的几個小問題,最好能够回答上來。同时還有代碼练习题,你可以挑战下自己的掌握程度。
173173
- 最好按照顺序循序渐进,每章都會有铺垫和联系,後面的章節可能會使用到前面提到的數據結構
174174
- 根據自己的基础結合我列举的教材和影片学习,第一次理解不了的可以反复多看几次,多编写代碼练习到熟练為止
175175

176176
## 课程目标
177-
掌握基本的算法和數據結構原理,能独立使用 Python 语言實現,能在日常開发中灵活选用數據結構
177+
掌握基本的算法和數據結構原理,能独立使用 Python 语言實現,能在日常開發中灵活选用數據結構
178178
對于找工作的同学提升面试成功率。
179179

180180

181-
## 開发和測试工具
181+
## 開發和測试工具
182182

183-
推荐使用以下工具进行開发,如果使用编辑器最好装對 应 Python 插件,笔者影片演示中使用了 vim,讀者可以自己挑选自己喜欢的開发工具
183+
推荐使用以下工具进行開發,如果使用编辑器最好装對 应 Python 插件,笔者影片演示中使用了 vim,讀者可以自己挑选自己喜欢的開發工具
184184

185185
- Pycharm
186186
- Sublime
@@ -208,7 +208,7 @@ pip install when-changed
208208
```
209209
'./test.sh somefile.py'
210210
```
211-
每次我們改動了代碼,就會自動执行代碼里的單元測试了。pytest 會自動发现以 test
211+
每次我們改動了代碼,就會自動执行代碼里的單元測试了。pytest 會自動發现以 test
212212
開头的函数并执行測试代碼。良好的工程需要我們用單測來保证,将來即使修改了内部實現逻辑也方便做回归验证。
213213

214214
或者你可以在的 ~/.bashrc or ~/.zshrc 里邊加上這個映射(别忘记加上之後source下):
@@ -223,7 +223,7 @@ alias watchtest='when-changed -v -r -1 -s ./ '
223223

224224
## 測试用例设计
225225

226-
笔者在刚学习编程的时候总是忘记处理一些特例(尤其是動态语言可以传各種值),為了养成良好的编程和測试习惯,在编写單元測试用例的时候,
226+
笔者在刚学习编程的时候总是忘记处理一些特例(尤其是動态语言可以傳各種值),為了养成良好的编程和測试习惯,在编写單元測试用例的时候,
227227
我們注意考虑下如下測试用例(等價类划分):
228228

229229
- 正常值功能測试
@@ -267,18 +267,18 @@ def test():
267267
```
268268

269269
當然我們也不用做的非常细致,要不然写測试是一件非常繁琐累人的事情,甚至有时候為了測试而測试,只是為了让單測覆盖率好看點。
270-
當然如果是web应用用户输入,我們要假设所有的参数都是不可信的。 但是很多内部调用的函数我們基于约定來编程,如果你瞎传参数,那就是调用者的责任了。
270+
當然如果是web应用用户输入,我們要假设所有的参数都是不可信的。 但是很多内部调用的函数我們基于约定來编程,如果你瞎傳参数,那就是调用者的责任了。
271271

272272

273273
## 勘誤
274274

275-
输出其实也是一種再学习的過程,中途需要查看大量资料、编写講義、影片录制、代碼编写等,难免有疏漏甚至错誤之处。
275+
输出其實也是一種再学习的過程,中途需要查看大量资料、编写講義、影片录制、代碼编写等,难免有疏漏甚至错誤之处。
276276
有出版社找過笔者想让我出书,一來自己對出书興趣不大,另外感覺书籍相對影片不够直觀,有错誤也不能及时修改,打算直接把所有文字内容講義和代碼等放到 github 上,供大家免费查阅。
277277

278-
如果你发现文字内容、代碼内容、影片内容有错誤或者有疑问,欢迎在 github 上提 issue 讨论(或者网易公開课评论區),或者直接提 Merge Request,我會尽量及时修正相關内容,防止對讀者产生誤导。
279-
同时非常感谢认真学习并及时发现书中错誤的同学,非常欢迎針對知识本身的交流和讨论,任何建議和修正我都會认真求证。
278+
如果你發现文字内容、代碼内容、影片内容有错誤或者有疑问,欢迎在 github 上提 issue 讨论(或者网易公開课评论區),或者直接提 Merge Request,我會尽量及时修正相關内容,防止對讀者产生誤导。
279+
同时非常感谢认真学习并及时發现书中错誤的同学,非常欢迎針對知识本身的交流和讨论,任何建議和修正我都會认真求证。
280280
對于提出修正意見或者提交代碼的同学,由于人数比较多這裡就不一一列举了,可以在以下列表查看,再次感谢你们。笔者信奉開源精神,『眼睛足够多,bug 无处藏』。
281-
如果您发现影片中的代碼有誤,請及时使用 git pull 拉取本项目的代碼更新,最好用目前最新的代碼來学习和实践
281+
如果您發现影片中的代碼有誤,請及时使用 git pull 拉取本项目的代碼更新,最好用目前最新的代碼來学习和實践
282282

283283
[issue](https://github.com/PegasusWang/python_data_structures_and_algorithms/issues?q=is%3Aissue+is%3Aclosed)
284284

docs/00_课程简介之笨方法学算法/why_and_how_to_learn.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
举個例子:二分查找就是一個非常經典的算法,而二分查找經常需要作用在一個有序数组上。這裡二分就是一種折半的算法思想,
1212
而数组是我們最常用的一種數據結構,支持根據下标快速訪問。很多算法需要特定的數據結構來實現,所以經常把它们放到一块講。
1313

14-
实际上,在真正的项目開发中,大部分時間都是 从數據库取數據 -> 數據操作和結構化 -> 返回给前端,在數據操作過程中需要合理地抽象,
14+
實际上,在真正的项目開發中,大部分時間都是 从數據库取數據 -> 數據操作和結構化 -> 返回给前端,在數據操作過程中需要合理地抽象,
1515
组织、处理數據,如果选用了错誤的數據結構,就會造成代碼运行低效。這也是我們需要学习算法和數據結構的原因。
1616

1717
# 笨方法学算法
@@ -26,5 +26,5 @@
2626

2727
- 你還知道哪些經典的算法和數據結構?
2828
- 学习算法你覺得需要哪些预备知识?
29-
- 我們的业务代碼開发中會涉及到算法嗎
29+
- 我們的业务代碼開發中會涉及到算法嗎
3030
- 你了解 redis 嗎,你知道它有哪几個常用的數據結構嗎?你知道它的底层實現方式嗎?

docs/01_抽象数据类型和面向对象编程/ADT_OOP.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
举個例子,在 python 中我們經常使用的 list
44

55
```py
6-
l = list() # 实例化一個 list 對象 l
6+
l = list() # 實例化一個 list 對象 l
77
l.append(1) # 调用 l 的 append 方法
88
l.append(2)
99
l.remove(1)
@@ -17,7 +17,7 @@ print(len(l)) # 调用對象的 `__len__` 方法
1717

1818
# 什么是抽象數據类型 ADT
1919

20-
实际上 python 内置的 list 就可以看成一種抽象數據类型。
20+
實际上 python 内置的 list 就可以看成一種抽象數據类型。
2121

2222
ADT: Abstract Data Type,抽象數據类型,我們在组合已有的數據結構來實現一種新的數據类型, ADT 定義了类型的數據和操作。
2323

@@ -42,7 +42,7 @@ class Bag:
4242

4343

4444
# 小問題:
45-
- 你了解 python 的魔術方法嗎? 比如 `__len__` ,调用 len(l) 的时候发生了什么
45+
- 你了解 python 的魔術方法嗎? 比如 `__len__` ,调用 len(l) 的时候發生了什么
4646
- 你了解單測嗎?我們以後将使用 pytest 运行單元測试,保证我們實現的數據結構和算法是正确的。你可以网上搜索下它的簡單用法
4747

4848
# 延伸閱讀:

docs/02_数组和列表/array_and_list.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
# 数组 array
99

10-
数组是最常用到的一種線性結構,其实 python 内置了一個 array 模块,但是大部人甚至从來没用過它。
10+
数组是最常用到的一種線性結構,其實 python 内置了一個 array 模块,但是大部人甚至从來没用過它。
1111
Python 的 array 是内存连续、存储的都是同一數據类型的結構,而且只能存数值和字符。
1212

1313
我建議你课下看下 array 的文档:https://docs.python.org/2/library/array.html
@@ -17,7 +17,7 @@ Python 的 array 是内存连续、存储的都是同一數據类型的結構,
1717

1818

1919
# 列表 list
20-
如果你学過 C++,list 其实和 C++ STL(标准模板库)中的 vector 很类似,它可能是你的 Python 学习中使用最频繁的數據結構之一。
20+
如果你学過 C++,list 其實和 C++ STL(标准模板库)中的 vector 很类似,它可能是你的 Python 学习中使用最频繁的數據結構之一。
2121
這裡我們不再去自己實現 list,因為這是個 Python 提供的非常基础的數據类型,我會在影片中講解它的工作方式和内存分配策略,
2222
避免使用過程中碰到一些坑。當然如果你有毅力或者興趣的了解底层是如何實現的,可以看看 cpython 解释器的具體實現。
2323

@@ -40,7 +40,7 @@ list.remove | O(n) |
4040
# 小問題
4141
- 你知道線性結構的查找,删除,訪問一個元素的平均時間複雜度嗎?(後面我們會介绍這個概念,现在你可以簡單地理解為一個操作需要的平均步骤)
4242
- list 内存重新分配的时候為什么要有冗余?不會浪费空間嗎?
43-
- 當你频繁的pop list 的第一個元素的时候,會发生什么?如果需要频繁在兩头增添元素,你知道更高效的數據結構嗎?後面我們會講到
43+
- 當你频繁的pop list 的第一個元素的时候,會發生什么?如果需要频繁在兩头增添元素,你知道更高效的數據結構嗎?後面我們會講到
4444

4545

4646
# 延伸閱讀

docs/03_链表/double_link_list.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def __init__(self, value=None, prev=None, next=None):
1010

1111
class CircularDoubleLinkedList(object):
1212
"""循環双端鏈表 ADT
13-
多了個循環其实就是把 root 的 prev 指向 tail 節點,串起來
13+
多了個循環其實就是把 root 的 prev 指向 tail 節點,串起來
1414
"""
1515

1616
def __init__(self, maxsize=None):
@@ -29,7 +29,7 @@ def headnode(self):
2929
def tailnode(self):
3030
return self.root.prev
3131

32-
def append(self, value): # O(1), 你发现一般不用 for 循環的就是 O(1),有限個步骤
32+
def append(self, value): # O(1), 你發现一般不用 for 循環的就是 O(1),有限個步骤
3333
if self.maxsize is not None and len(self) >= self.maxsize:
3434
raise Exception('LinkedList is Full')
3535
node = Node(value=value)
@@ -58,9 +58,9 @@ def appendleft(self, value):
5858
self.root.next = node
5959
self.length += 1
6060

61-
def remove(self, node): # O(1),传入node 而不是 value 我們就能實現 O(1) 删除
61+
def remove(self, node): # O(1),傳入node 而不是 value 我們就能實現 O(1) 删除
6262
"""remove
63-
:param node # 在 lru_cache 里实际上根據key 保存了整個node:
63+
:param node # 在 lru_cache 里實际上根據key 保存了整個node:
6464
"""
6565
if node is self.root:
6666
return

0 commit comments

Comments
 (0)