Skip to content

Commit 7dce23c

Browse files
committed
My small translation.
1 parent 6c52262 commit 7dce23c

File tree

49 files changed

+1108
-1108
lines changed

Some content is hidden

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

49 files changed

+1108
-1108
lines changed

README.md

Lines changed: 137 additions & 137 deletions
Large diffs are not rendered by default.
Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
# 什么是算法和数据结构
1+
# 什么是算法和數據結構
22

3-
你可能会在一些教材上看到这句话
3+
你可能會在一些教材上看到這句话
44

5-
程序 = 算法 + 数据结构
5+
程序 = 算法 + 數據結構
66

7-
算法(Algorithm):是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出
7+
算法(Algorithm):是指解题方案的准确而完整的描述,是一系列解决問題的清晰指令,算法代表着用系统的方法描述解决問題的策略机制。也就是說,能够對一定规范的输入,在有限時間内获得所要求的输出
88

9-
数据结构(Data Structures):是计算机存储和组织数据的一种方式,可以用来高效地处理数据
9+
數據結構(Data Structures):是计算机存储和组织數據的一種方式,可以用來高效地处理數據
1010

11-
举个例子:二分查找就是一个非常经典的算法,而二分查找经常需要作用在一个有序数组上。这里二分就是一种折半的算法思想
12-
而数组是我们最常用的一种数据结构,支持根据下标快速访问。很多算法需要特定的数据结构来实现,所以经常把它们放到一块讲
11+
举個例子:二分查找就是一個非常經典的算法,而二分查找經常需要作用在一個有序数组上。這裡二分就是一種折半的算法思想
12+
而数组是我們最常用的一種數據結構,支持根據下标快速訪問。很多算法需要特定的數據結構來實現,所以經常把它们放到一块講
1313

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

1717
# 笨方法学算法
18-
这里我们用一种很原始的『笨』方法来学习算法:纸笔模拟
18+
這裡我們用一種很原始的『笨』方法來学习算法:纸笔模擬
1919

20-
- 阅读资料了解算法思想
21-
- 纸笔模拟尝试理解
22-
- 用自己熟悉的编程语言来实现
23-
- 单测
20+
- 閱讀资料了解算法思想
21+
- 纸笔模擬嘗試理解
22+
- 用自己熟悉的编程语言來實現
23+
- 單測
2424

25-
# 小问题
25+
# 小問題
2626

27-
- 你还知道哪些经典的算法和数据结构
28-
- 学习算法你觉得需要哪些预备知识
29-
- 我们的业务代码开发中会涉及到算法吗
30-
- 你了解 redis 吗,你知道它有哪几个常用的数据结构吗?你知道它的底层实现方式吗
27+
- 你還知道哪些經典的算法和數據結構
28+
- 学习算法你覺得需要哪些预备知识
29+
- 我們的业务代碼開发中會涉及到算法嗎
30+
- 你了解 redis 嗎,你知道它有哪几個常用的數據結構嗎?你知道它的底层實現方式嗎
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# Python 一切皆对象
1+
# Python 一切皆對象
22

3-
举个例子,在 python 中我们经常使用的 list
3+
举個例子,在 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)
10-
print(len(l)) # 调用对象的 `__len__` 方法
10+
print(len(l)) # 调用對象的 `__len__` 方法
1111
```
1212

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

1717

18-
# 什么是抽象数据类型 ADT
18+
# 什么是抽象數據类型 ADT
1919

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

22-
ADT: Abstract Data Type,抽象数据类型,我们在组合已有的数据结构来实现一种新的数据类型, ADT 定义了类型的数据和操作
22+
ADT: Abstract Data Type,抽象數據类型,我們在组合已有的數據結構來實現一種新的數據类型, ADT 定義了类型的數據和操作
2323

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

2727
```py
2828
class Bag:
@@ -31,22 +31,22 @@ class Bag:
3131
```
3232

3333

34-
# 实现一个 Bag ADT
35-
视频中我们将使用 python 的 class 来实现一个新的容器类型叫做 Bag。
34+
# 實現一個 Bag ADT
35+
影片中我們将使用 python 的 class 來實現一個新的容器类型叫做 Bag。
3636

3737

38-
# 实现 ADT 我们应该注意什么
39-
- 如何选用恰当的数据结构作为存储
40-
- 选取的数据结构能否满足 ADT 的功能需求
41-
- 实现效率如何
38+
# 實現 ADT 我們应该注意什么
39+
- 如何选用恰當的數據結構作為存储
40+
- 选取的數據結構能否满足 ADT 的功能需求
41+
- 實現效率如何
4242

4343

44-
# 小问题
45-
- 你了解 python 的魔术方法吗? 比如 `__len__` ,调用 len(l) 的时候发生了什么?
46-
- 你了解单测吗?我们以后将使用 pytest 运行单元测试,保证我们实现的数据结构和算法是正确的。你可以网上搜索下它的简单用法
44+
# 小問題
45+
- 你了解 python 的魔術方法嗎? 比如 `__len__` ,调用 len(l) 的时候发生了什么?
46+
- 你了解單測嗎?我們以後将使用 pytest 运行單元測试,保证我們實現的數據結構和算法是正确的。你可以网上搜索下它的簡單用法
4747

48-
# 延伸阅读
48+
# 延伸閱讀
4949

50-
[数据结构与算法--ADT](http://www.atjiang.com/data-structures-using-python-ADT/)
50+
[數據結構与算法--ADT](http://www.atjiang.com/data-structures-using-python-ADT/)
5151

5252
[http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf](http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf)
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
# 线性结构
2-
本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解
3-
虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑
1+
# 線性結構
2+
本節我們从最簡單和常用的線性結構開始,并結合 Python 语言本身内置的數據結構和其底层實現方式來講解
3+
雖然本质上數據結構的思想是语言无關的,但是了解 Python 的實現方式有助于你避免一些坑
44

5-
我们会在代码中注释出操作的时间复杂度
5+
我們會在代碼中注释出操作的時間複雜度
66

77

88
# 数组 array
99

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

13-
我建议你课下看下 array 的文档:https://docs.python.org/2/library/array.html
13+
我建議你课下看下 array 的文档:https://docs.python.org/2/library/array.html
1414

15-
你可能很少会使用到它(我推荐你用 numpy.array),我将在视频里简单介绍下它的使用和工作方式,最常用的还是接下来要说的 list,
16-
本章最后我们会用 list 来实现一个固定长度、并且支持所有 Python 数据类型的数组 Array.
15+
你可能很少會使用到它(我推荐你用 numpy.array),我将在影片里簡單介绍下它的使用和工作方式,最常用的還是接下來要說的 list,
16+
本章最後我們會用 list 來實現一個固定长度、并且支持所有 Python 數據类型的数组 Array.
1717

1818

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

2424

25-
操作 | 平均时间复杂度 |
25+
操作 | 平均時間複雜度 |
2626
--------------------------------------|----------------|
2727
list[index] | O(1) |
2828
list.append | O(1) |
@@ -32,23 +32,23 @@ list.remove | O(n) |
3232

3333
![](./list.png)
3434

35-
# 用 list 实现 Array ADT
36-
讲完了 list 让我们来实现一个定长的数组 Array ADT,在其他一些语言中,内置的数组结构就是定长的
37-
这里我们会使用 list 作为 Array 的一个成员(代理)。具体请参考视频讲解和代码示例,后边我们会使用到这个 Array 类。
35+
# 用 list 實現 Array ADT
36+
講完了 list 让我們來實現一個定长的数组 Array ADT,在其他一些语言中,内置的数组結構就是定长的
37+
這裡我們會使用 list 作為 Array 的一個成员(代理)。具體請参考影片講解和代碼示例,後面我們會使用到這個 Array 类。
3838

3939

40-
# 小问题
41-
- 你知道线性结构的查找,删除,访问一个元素的平均时间复杂度吗?(后边我们会介绍这个概念,现在你可以简单地理解为一个操作需要的平均步骤)
42-
- list 内存重新分配的时候为什么要有冗余?不会浪费空间吗
43-
- 当你频繁的pop list 的第一个元素的时候,会发生什么?如果需要频繁在两头增添元素,你知道更高效的数据结构吗?后边我们会讲到
40+
# 小問題
41+
- 你知道線性結構的查找,删除,訪問一個元素的平均時間複雜度嗎?(後面我們會介绍這個概念,现在你可以簡單地理解為一個操作需要的平均步骤)
42+
- list 内存重新分配的时候為什么要有冗余?不會浪费空間嗎
43+
- 當你频繁的pop list 的第一個元素的时候,會发生什么?如果需要频繁在兩头增添元素,你知道更高效的數據結構嗎?後面我們會講到
4444

4545

46-
# 延伸阅读
46+
# 延伸閱讀
4747

4848
[Python list implementation](https://www.laurentluce.com/posts/python-list-implementation/)
4949

5050
[https://github.com/python/cpython/blob/master/Objects/listobject.c](https://github.com/python/cpython/blob/master/Objects/listobject.c)
5151

5252

53-
# 勘误
54-
视频里的 Array.clear 方法有误。应该是 `for i in range(len(self._items))`已经在后续所有使用到 Array 的代码里修正
53+
# 勘誤
54+
影片里的 Array.clear 方法有誤。应该是 `for i in range(len(self._items))`已經在後续所有使用到 Array 的代碼里修正

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
print(arr[0], arr[1], arr[2], arr[3])
1010

1111

12-
# 实现定长的 Array ADT,省略了边界检查等
12+
# 實現定长的 Array ADT,省略了邊界检查等
1313

1414
class Array(object):
1515

docs/03_链表/double_link_list.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ def __init__(self, value=None, prev=None, next=None):
99

1010

1111
class CircularDoubleLinkedList(object):
12-
"""循环双端链表 ADT
13-
多了个循环其实就是把 root 的 prev 指向 tail 节点,串起来
12+
"""循環双端鏈表 ADT
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
@@ -84,7 +84,7 @@ def __iter__(self):
8484
yield node.value
8585

8686
def iter_node_reverse(self):
87-
"""相比单链表独有的反序遍历"""
87+
"""相比單鏈表独有的反序遍历"""
8888
if self.root.prev is self.root:
8989
return
9090
curnode = self.root.prev

0 commit comments

Comments
 (0)