Skip to content

Commit e267a04

Browse files
SmallJunegitbook-bot
authored andcommitted
GitBook: [master] 71 pages modified
1 parent 18a6409 commit e267a04

File tree

59 files changed

+1623
-1628
lines changed

Some content is hidden

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

59 files changed

+1623
-1628
lines changed

README.md

Lines changed: 158 additions & 171 deletions
Large diffs are not rendered by default.

SUMMARY.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Table of contents
2+
3+
* [README](README.md)
4+
* [docs](docs/README.md)
5+
* [index](docs/index.md)
6+
* [00\_课程简介之笨方法学算法](docs/00-ke-cheng-jian-jie-zhi-ben-fang-fa-xue-suan-fa/README.md)
7+
* [why\_and\_how\_to\_learn](docs/00-ke-cheng-jian-jie-zhi-ben-fang-fa-xue-suan-fa/why_and_how_to_learn.md)
8+
* [01\_抽象数据类型和面向对象编程](docs/01-chou-xiang-shu-ju-lei-xing-he-mian-xiang-dui-xiang-bian-cheng/README.md)
9+
* [ADT\_OOP](docs/01-chou-xiang-shu-ju-lei-xing-he-mian-xiang-dui-xiang-bian-cheng/adt_oop.md)
10+
* [02\_数组和列表](docs/02-shu-zu-he-lie-biao/README.md)
11+
* [array\_and\_list](docs/02-shu-zu-he-lie-biao/array_and_list.md)
12+
* [03\_链表](docs/03-lian-biao/README.md)
13+
* [linked\_list](docs/03-lian-biao/linked_list.md)
14+
* [04\_队列](docs/04-dui-lie/README.md)
15+
* [queue](docs/04-dui-lie/queue.md)
16+
* [05\_](docs/05-zhan/README.md)
17+
* [stack](docs/05-zhan/stack.md)
18+
* [06\_算法分析](docs/06-suan-fa-fen-xi/README.md)
19+
* [big\_o](docs/06-suan-fa-fen-xi/big_o.md)
20+
* [07\_哈希表](docs/07-ha-xi-biao/README.md)
21+
* [hashtable](docs/07-ha-xi-biao/hashtable.md)
22+
* [08\_字典](docs/08-zi-dian/README.md)
23+
* [dict](docs/08-zi-dian/dict.md)
24+
* [09\_集合](docs/09-ji-he/README.md)
25+
* [set](docs/09-ji-he/set.md)
26+
* [10\_递归](docs/10-di-gui/README.md)
27+
* [recursion](docs/10-di-gui/recursion.md)
28+
* [11\_线性查找与二分查找](docs/11-xian-xing-cha-zhao-yu-er-fen-cha-zhao/README.md)
29+
* [search](docs/11-xian-xing-cha-zhao-yu-er-fen-cha-zhao/search.md)
30+
* [12\_基本排序算法](docs/12-ji-ben-pai-xu-suan-fa/README.md)
31+
* [basic\_sort](docs/12-ji-ben-pai-xu-suan-fa/basic_sort.md)
32+
* [13\_高级排序算法](docs/13-gao-ji-pai-xu-suan-fa/README.md)
33+
* [高级排序算法](docs/13-gao-ji-pai-xu-suan-fa/advanced_sorting.md)
34+
* [merge\_sort](docs/13-gao-ji-pai-xu-suan-fa/merge_sort.md)
35+
* [quick\_sort](docs/13-gao-ji-pai-xu-suan-fa/quick_sort.md)
36+
* [14\_树与二叉树](docs/14-shu-yu-er-cha-shu/README.md)
37+
* [tree](docs/14-shu-yu-er-cha-shu/tree.md)
38+
* [15\_堆与堆排序](docs/15-dui-yu-dui-pai-xu/README.md)
39+
* [heap\_and\_heapsort](docs/15-dui-yu-dui-pai-xu/heap_and_heapsort.md)
40+
* [16\_优先级队列](docs/16-you-xian-ji-dui-lie/README.md)
41+
* [priority\_queue](docs/16-you-xian-ji-dui-lie/priority_queue.md)
42+
* [17\_二叉查找树](docs/17-er-cha-cha-zhao-shu/README.md)
43+
* [binary\_search\_tree](docs/17-er-cha-cha-zhao-shu/binary_search_tree.md)
44+
* [18\_图与图的遍历](docs/18-tu-yu-tu-de-bian-li/README.md)
45+
* [graph](docs/18-tu-yu-tu-de-bian-li/graph.md)
46+
* [19\_python内置常用算法和数据结构](docs/19python-nei-zhi-chang-yong-suan-fa-he-shu-ju-jie-gou/README.md)
47+
* [Python 常用内置算法和数据结构](docs/19python-nei-zhi-chang-yong-suan-fa-he-shu-ju-jie-gou/builtins.md)
48+
* [20\_面试指南](docs/20-mian-shi-zhi-nan/README.md)
49+
* [interview](docs/20-mian-shi-zhi-nan/interview.md)
50+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# 00\_课程简介之笨方法学算法
2+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# why\_and\_how\_to\_learn
2+
3+
## 什么是算法和数据结构?
4+
5+
你可能会在一些教材上看到这句话:
6+
7+
程序 = 算法 + 数据结构
8+
9+
算法(Algorithm):是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
10+
11+
数据结构(Data Structures):是计算机存储和组织数据的一种方式,可以用来高效地处理数据。
12+
13+
举个例子:二分查找就是一个非常经典的算法,而二分查找经常需要作用在一个有序数组上。这里二分就是一种折半的算法思想, 而数组是我们最常用的一种数据结构,支持根据下标快速访问。很多算法需要特定的数据结构来实现,所以经常把它们放到一块讲。
14+
15+
实际上,在真正的项目开发中,大部分时间都是 从数据库取数据 -> 数据操作和结构化 -> 返回给前端,在数据操作过程中需要合理地抽象, 组织、处理数据,如果选用了错误的数据结构,就会造成代码运行低效。这也是我们需要学习算法和数据结构的原因。
16+
17+
## 笨方法学算法
18+
19+
这里我们用一种很原始的『笨』方法来学习算法:纸笔模拟。
20+
21+
* 阅读资料了解算法思想
22+
* 纸笔模拟尝试理解
23+
* 用自己熟悉的编程语言来实现
24+
* 单测
25+
26+
## 小问题
27+
28+
* 你还知道哪些经典的算法和数据结构?
29+
* 学习算法你觉得需要哪些预备知识?
30+
* 我们的业务代码开发中会涉及到算法吗?
31+
* 你了解 redis 吗,你知道它有哪几个常用的数据结构吗?你知道它的底层实现方式吗?
32+

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

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# 01\_抽象数据类型和面向对象编程
2+
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,51 @@
1-
# Python 一切皆对象
1+
# ADT\_OOP
2+
3+
## Python 一切皆对象
24

35
举个例子,在 python 中我们经常使用的 list
46

5-
```py
7+
```python
68
l = list() # 实例化一个 list 对象 l
79
l.append(1) # 调用 l 的 append 方法
810
l.append(2)
911
l.remove(1)
1012
print(len(l)) # 调用对象的 `__len__` 方法
1113
```
1214

13-
在后面实现新的数据类型时,我们将使用 python 的 class 实现,它包含属性和方法。
14-
属性一般是使用某种特定的数据类型,而方法一般是对属性的操作。
15-
这里你只需了解这么多就行了, 我们不会使用继承等特性。
16-
15+
在后面实现新的数据类型时,我们将使用 python 的 class 实现,它包含属性和方法。 属性一般是使用某种特定的数据类型,而方法一般是对属性的操作。 这里你只需了解这么多就行了, 我们不会使用继承等特性。
1716

18-
# 什么是抽象数据类型 ADT
17+
## 什么是抽象数据类型 ADT
1918

2019
实际上 python 内置的 list 就可以看成一种抽象数据类型。
2120

2221
ADT: Abstract Data Type,抽象数据类型,我们在组合已有的数据结构来实现一种新的数据类型, ADT 定义了类型的数据和操作。
2322

24-
我们以抽象一个背包(Bag) 数据类型来说明,背包是一种容器类型,我们可以给它添加东西,也可以移除东西,并且我们想知道背包里
25-
有多少东西。于是我们可以定义一个新的数据类型叫做 Bag.
23+
我们以抽象一个背包\(Bag\) 数据类型来说明,背包是一种容器类型,我们可以给它添加东西,也可以移除东西,并且我们想知道背包里 有多少东西。于是我们可以定义一个新的数据类型叫做 Bag.
2624

27-
```py
25+
```python
2826
class Bag:
2927
""" 背包类型 """
3028
pass
3129
```
3230

31+
## 实现一个 Bag ADT
3332

34-
# 实现一个 Bag ADT
3533
视频中我们将使用 python 的 class 来实现一个新的容器类型叫做 Bag。
3634

35+
## 实现 ADT 我们应该注意什么?
3736

38-
# 实现 ADT 我们应该注意什么?
39-
- 如何选用恰当的数据结构作为存储?
40-
- 选取的数据结构能否满足 ADT 的功能需求
41-
- 实现效率如何?
37+
* 如何选用恰当的数据结构作为存储?
38+
* 选取的数据结构能否满足 ADT 的功能需求
39+
* 实现效率如何?
4240

41+
## 小问题:
4342

44-
# 小问题:
45-
- 你了解 python 的魔术方法吗? 比如 `__len__` ,调用 len(l) 的时候发生了什么?
46-
- 你了解单测吗?我们以后将使用 pytest 运行单元测试,保证我们实现的数据结构和算法是正确的。你可以网上搜索下它的简单用法
43+
* 你了解 python 的魔术方法吗? 比如 `__len__` ,调用 len\(l\) 的时候发生了什么?
44+
* 你了解单测吗?我们以后将使用 pytest 运行单元测试,保证我们实现的数据结构和算法是正确的。你可以网上搜索下它的简单用法
4745

48-
# 延伸阅读:
46+
## 延伸阅读:
4947

5048
[数据结构与算法--ADT](http://www.atjiang.com/data-structures-using-python-ADT/)
5149

5250
[http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf](http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf)
51+

docs/02-shu-zu-he-lie-biao/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# 02\_数组和列表
2+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# array\_and\_list
2+
3+
## 线性结构
4+
5+
本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。 虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑。
6+
7+
我们会在代码中注释出操作的时间复杂度。
8+
9+
## 数组 array
10+
11+
数组是最常用到的一种线性结构,其实 python 内置了一个 array 模块,但是大部人甚至从来没用过它。 Python 的 array 是内存连续、存储的都是同一数据类型的结构,而且只能存数值和字符。
12+
13+
我建议你课下看下 array 的文档:[https://docs.python.org/2/library/array.html](https://docs.python.org/2/library/array.html)
14+
15+
你可能很少会使用到它\(我推荐你用 numpy.array\),我将在视频里简单介绍下它的使用和工作方式,最常用的还是接下来要说的 list, 本章最后我们会用 list 来实现一个固定长度、并且支持所有 Python 数据类型的数组 Array.
16+
17+
## 列表 list
18+
19+
如果你学过 C++,list 其实和 C++ STL(标准模板库)中的 vector 很类似,它可能是你的 Python 学习中使用最频繁的数据结构之一。 这里我们不再去自己实现 list,因为这是个 Python 提供的非常基础的数据类型,我会在视频中讲解它的工作方式和内存分配策略, 避免使用过程中碰到一些坑。当然如果你有毅力或者兴趣的了解底层是如何实现的,可以看看 cpython 解释器的具体实现。
20+
21+
| 操作 | 平均时间复杂度 |
22+
| :--- | :--- |
23+
| list\[index\] | O\(1\) |
24+
| list.append | O\(1\) |
25+
| list.insert | O\(n\) |
26+
| list.pop\(index\), default last element | O\(1\) |
27+
| list.remove | O\(n\) |
28+
29+
![](../../.gitbook/assets/list.png)
30+
31+
## 用 list 实现 Array ADT
32+
33+
讲完了 list 让我们来实现一个定长的数组 Array ADT,在其他一些语言中,内置的数组结构就是定长的。 这里我们会使用 list 作为 Array 的一个成员(代理)。具体请参考视频讲解和代码示例,后边我们会使用到这个 Array 类。
34+
35+
## 小问题
36+
37+
* 你知道线性结构的查找,删除,访问一个元素的平均时间复杂度吗?\(后边我们会介绍这个概念,现在你可以简单地理解为一个操作需要的平均步骤\)
38+
* list 内存重新分配的时候为什么要有冗余?不会浪费空间吗?
39+
* 当你频繁的pop list 的第一个元素的时候,会发生什么?如果需要频繁在两头增添元素,你知道更高效的数据结构吗?后边我们会讲到
40+
41+
## 延伸阅读
42+
43+
[Python list implementation](https://www.laurentluce.com/posts/python-list-implementation/)
44+
45+
[https://github.com/python/cpython/blob/master/Objects/listobject.c](https://github.com/python/cpython/blob/master/Objects/listobject.c)
46+
47+
## 勘误
48+
49+
视频里的 Array.clear 方法有误。应该是 `for i in range(len(self._items))`,已经在后续所有使用到 Array 的代码里修正
50+

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

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

docs/03-lian-biao/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# 03\_链表
2+

0 commit comments

Comments
 (0)