Skip to content

Commit 82ffb1d

Browse files
author
wangningning
committed
Merge branch 'master' of github.com:PegasusWang/python_data_structures_and_algorithms
2 parents 0355662 + acdc0e1 commit 82ffb1d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1291
-219
lines changed

README.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
数据结构和算法是每个程序员需要掌握的基础知识之一,也是面试中跨不过的槛。目前关于 Python 算法和数据结构的中文资料比较欠缺,
55
笔者尝试录制视频教程帮助 Python 初学者掌握常用算法和数据结构,提升开发技能。
66
本教程是付费教程(文字内容和代码免费),因为笔者录制的过程中除了购买软件、手写板等硬件之外,业余需要花费很多时间和精力来录制视频、查资料、编写课件和代码,养家糊口不容易,希望大家体谅。
7+
(视频未完成,完成后会在本页面放出链接)
78

89
## 链接
910

@@ -20,9 +21,10 @@
2021
- 网上很多视频教程比较水,收费还很不合理,纯属智商税
2122

2223
## 作者简介
23-
目前就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities)从实习期间接触 Python 起一直从事 Python 网站后端开发,有一定 Python 的使用和实践经验
24+
目前就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities)任后端工程师,多年一线 Python 开发经验
2425

2526
知乎专栏:
27+
2628
- [《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
2729
- [《玩转vim(视频)》](https://zhuanlan.zhihu.com/vim-video)
2830

@@ -39,7 +41,7 @@
3941
- 使用场景,什么时候用
4042

4143
## 目录结构
42-
这里讲解的章节我参考了下边教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进。因为实现一些高级数据结构的时候会用到
44+
这里讲解的章节我参考了下边教材中列举的一些书籍,并且自己设计了大纲,争取做到循序渐进,简单实用。因为实现一些高级数据结构的时候会用到
4345
很多底层数据结构,防止跳跃太大导致读者理解困难。
4446

4547
课程的目录结构如下,每一章都有配套的文字讲义(markdown),示例代码,视频讲解,详细的讲解一般会放在视频里,使用手写板来
@@ -62,7 +64,9 @@
6264
- 高级排序算法: 归并排序、快排
6365
- 树,二叉树
6466
- 堆与堆排序
65-
- 图,dfs 和 bfs
67+
- 优先级队列
68+
- 二叉查找树
69+
- 图与图的遍历
6670
- python 内置常用数据结构和算法的使用。list, dict, set, collections 模块,heapq 模块
6771
- 面试笔试常考算法
6872

@@ -93,7 +97,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
9397
[《Data Structures and Algorithms in Python》]( https://book.douban.com/subject/10607365/): 适合对 Python
9498
和算法比较熟悉的同学,或者是有其他语言编程经验的同学。英文版,缺点是书中错误真的很多,代码有些无法运行
9599

96-
[《算法导论》]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
100+
[《算法导论》第三版]( https://book.douban.com/subject/20432061/): 喜欢数学证明和板砖书的同学可以参考,有很多高级主题。使用伪代码
97101

98102

99103
## 讲课形式
@@ -127,10 +131,15 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
127131
## 资料
128132

129133
- 视频。包含所有讲解视频
130-
- 代码示例。所有代码我会放到 github 上。注意每一章目录里都有 py 文件,在电子书里看不到。clone 下代码找到对应目录里的 python 文件即是每章涉及到的代码。
134+
- 代码示例。所有代码我会放到 github 上。
131135
- markdown 讲义,包含视频内容的提要等内容
132136
- 延伸阅读。我会附上一些阅读资料方便想深入学习的同学
133137

138+
## 如何获取每章代码
139+
140+
注意每一章目录里都有 py 文件,在电子书里看不到。clone 下代码找到对应目录里的 python 文件即是每章涉及到的代码。
141+
142+
134143
## 如何学习
135144
笔者讲课录制视频的过程也是自己再整理和学习的过程,录制视频之前需要参考很多资料
136145
希望对所讲到的内容,你能够
@@ -157,7 +166,7 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
157166
- Sublime
158167
- Atom
159168
- Vscode
160-
- Vim
169+
- Vim/Emacs
161170

162171

163172
## 勘误
@@ -180,6 +189,8 @@ pip install https://github.com/mitya57/python-markdown-math/archive/master.zip
180189

181190
# 或者直接
182191
pip install -r requirements.txt
192+
193+
# 如果你 fork 了本项目,可以定期拉取主仓库的代码来获取更新,目前还在不断更新相关章节
183194
```
184195

185196
编写并查看:

docs/05_栈/stack.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
本章我们讲讲 后进先出的栈。
66

77
生活中的数据结构:
8+
89
- 栈。好比在桶里头放盘子,先放的盘子放在了底下,后来的盘子放在上边。你要拿的时候,也是先拿最上边的。
910

1011
栈其实也很简单,因为基础操作就俩,一个 push 和一个 pop,咦,咋和队列一样的?

docs/10_递归/recursion.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,4 @@ Move A -> C
198198
- 你能举出其他一些使用到递归的例子吗?
199199
- 实现一个 flatten 函数,把嵌套的列表扁平化,你需要用递归函数来实现。比如 [[1,2], [1,2,3] -> [1,2,1,2,3]
200200
- 使用递归和循环各有什么优缺点,你能想到吗?怎么把一个尾递归用迭代替换?
201-
- 递归有时候虽然很优雅,但是时间复杂度却不理想,比如斐波那契数列,它的表达式是 F(n) = F(n-1) + F(n-2),你能计算它的时间复杂度吗?我们怎样去优化它
201+
- 递归有时候虽然很优雅直观,但是时间复杂度却不理想,比如斐波那契数列,它的表达式是 F(n) = F(n-1) + F(n-2),你能计算它的时间复杂度吗?请你画个树来表示它的计算过程,为什么这个时间复杂度很不理想?我们怎样去优化它

docs/13_高级排序算法/advanced_sorting.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77

88
在讲完二叉树之后,我们会看下它的应用:
99

10-
- [堆和堆排序](./heap_sort.md)
10+
- 堆和堆排序

docs/13_高级排序算法/quick_sort.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_quicksort():
3232
random.shuffle(seq)
3333
assert quicksort(seq) == sorted(seq)
3434
```
35-
是不是很简单,下次面试官让你手写快排你再写不出来就有点过分啦。 当然这个实现有两个不好的地方:
35+
是不是很简单,下次面试官让你手写快排你再写不出来就有点不太合适啦。 当然这个实现有两个不好的地方:
3636

3737
- 第一是它需要额外的存储空间,我们想实现 inplace 原地排序。
3838
- 第二是它的 partion 操作每次都要两次遍历整个数组,我们想改善一下。
@@ -47,7 +47,7 @@ def quicksort_inplace(array, beg, end): # 注意这里我们都用左闭右
4747
quicksort_inplace(array, pivot+1, end)
4848
```
4949

50-
能否实现只遍历一次数组就可以完成 partition 操作呢?实际上是可以的。我们设置首位俩个指针 left, right,两个指针不断向中间收拢。如果遇到 left 位置的元素大于 pivot 并且 right 指向的元素小于 pivot,我们就交换这俩元素,当 left > right 的时候推出就行了,这样实现了一次遍历就完成了 partition。如果你感觉懵逼,纸上画画就立马明白了。我们来撸代码实现:
50+
能否实现只遍历一次数组就可以完成 partition 操作呢?实际上是可以的。我们设置首位俩个指针 left, right,两个指针不断向中间收拢。如果遇到 left 位置的元素大于 pivot 并且 right 指向的元素小于 pivot,我们就交换这俩元素,当 left > right 的时候退出就行了,这样实现了一次遍历就完成了 partition。如果你感觉懵逼,纸上画画就立马明白了。我们来撸代码实现:
5151

5252
```py
5353
def partition(array, beg, end):
@@ -105,3 +105,4 @@ T(n) = 2T(n/2) + n
105105

106106
# 延伸阅读
107107
- 《算法导论》第 7 章
108+
- [《面试必备 | 排序算法的Python实现》](https://zhuanlan.zhihu.com/p/36419582)
77.6 KB
Loading
57.1 KB
Loading

docs/14_树与二叉树/btree.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# -*- coding: utf-8 -*-
2+
3+
4+
class BinTreeNode(object):
5+
def __init__(self, data, left=None, right=None):
6+
self.data, self.left, self.right = data, left, right
7+
8+
9+
class BinTree(object):
10+
def __init__(self, root=None):
11+
self.root = root
12+
13+
@classmethod
14+
def build_from(cls, node_list):
15+
"""build_from
16+
17+
:param node_list: {'data': 'A', 'left': None, 'right': None, 'is_root': False}
18+
"""
19+
node_dict = {}
20+
for node_data in node_list:
21+
data = node_data['data']
22+
node_dict[data] = BinTreeNode(data)
23+
for node_data in node_list:
24+
data = node_data['data']
25+
node = node_dict[data]
26+
if node_data['is_root']:
27+
root = node
28+
node.left = node_dict.get(node_data['left'])
29+
node.right = node_dict.get(node_data['right'])
30+
return cls(root)
31+
32+
def preorder_trav(self, subtree):
33+
if subtree is not None:
34+
print(subtree.data)
35+
self.preorder_trav(subtree.left)
36+
self.preorder_trav(subtree.right)
37+
38+
def reverse(self, subtree):
39+
if subtree is not None:
40+
subtree.left, subtree.right = subtree.right, subtree.left
41+
self.reverse(subtree.left)
42+
self.reverse(subtree.right)
43+
44+
45+
node_list = [
46+
{'data': 'A', 'left': 'B', 'right': 'C', 'is_root': True},
47+
{'data': 'B', 'left': 'D', 'right': 'E', 'is_root': False},
48+
{'data': 'D', 'left': None, 'right': None, 'is_root': False},
49+
{'data': 'E', 'left': 'H', 'right': None, 'is_root': False},
50+
{'data': 'H', 'left': None, 'right': None, 'is_root': False},
51+
{'data': 'C', 'left': 'F', 'right': 'G', 'is_root': False},
52+
{'data': 'F', 'left': None, 'right': None, 'is_root': False},
53+
{'data': 'G', 'left': 'I', 'right': 'J', 'is_root': False},
54+
{'data': 'I', 'left': None, 'right': None, 'is_root': False},
55+
{'data': 'J', 'left': None, 'right': None, 'is_root': False},
56+
]
57+
58+
59+
btree = BinTree.build_from(node_list)
60+
btree.preorder_trav(btree.root)
61+
btree.reverse(btree.root)
62+
print('====我是华丽丽滴分割线=====')
63+
btree.preorder_trav(btree.root)
53.5 KB
Loading
69.5 KB
Loading
30 KB
Loading
19.7 KB
Loading

docs/14_树与二叉树/preorder.png

60.2 KB
Loading

0 commit comments

Comments
 (0)