File tree Expand file tree Collapse file tree 6 files changed +14
-4
lines changed Expand file tree Collapse file tree 6 files changed +14
-4
lines changed Original file line number Diff line number Diff line change @@ -106,7 +106,7 @@ def print_num_use_stack(n):
106
106
这里结果也是输出 1 到 10,只不过我们是手动模拟了入栈和出栈的过程,帮助你理解计算机是如何实现递归的,是不是挺简单!现在你能明白为什么上边 print_num_recursive print_num_recursive_revserve 两个函数输出的区别了吗?
107
107
108
108
# 尾递归
109
- 上边的代码示例中实际上包含了两种形式的递归 ,一种是普通的递归,还有一种叫做尾递归:
109
+ 上边的代码示例(麻雀虽小五脏俱全)中实际上包含了两种形式的递归 ,一种是普通的递归,还有一种叫做尾递归:
110
110
111
111
``` py
112
112
def print_num_recursive (n ):
Original file line number Diff line number Diff line change @@ -30,6 +30,7 @@ list.insert | O(n) |
30
30
list.pop(index), default last element | O(1) |
31
31
list.remove | O(n) |
32
32
33
+ ![ ] ( ./list.png )
33
34
34
35
# 用 list 实现 Array ADT
35
36
讲完了 list 让我们来实现一个定长的数组 Array ADT,在其他一些语言中,内置的数组结构就是定长的。
Original file line number Diff line number Diff line change @@ -37,7 +37,7 @@ class LinkedList(object):
37
37
38
38
来看下时间复杂度:
39
39
40
- 操作 | 平均时间复杂度 |
40
+ 链表操作 | 平均时间复杂度 |
41
41
------------------------------|----------------|
42
42
linked_list.append(value) | O(1) |
43
43
linked_list.appendleft(value) | O(1) |
@@ -67,7 +67,15 @@ class Node(object):
67
67
- 直接删除节点,当然如果给的是一个值,我们还是需要查找这个值在哪个节点? - 但是如果给了一个节点,我们把它拿掉,直接让它的前后节点互相指过去不就行了?哇欧,删除就是 O(1) 了,两步操作就行啦
68
68
69
69
好,废话不多说,我们在视频里介绍怎么实现一个双链表 ADT。
70
-
70
+ 最后让我们看下它的时间复杂度:(这里 CircularDoubleLinkedList 取大写字母缩写为 cdll)
71
+
72
+ 循环双端链表操作 | 平均时间复杂度 |
73
+ ---------------------------------------|----------------|
74
+ cdll.append(value) | O(1) |
75
+ cdll.appendleft(value) | O(1) |
76
+ cdll.remove(node),注意这里参数是 node | O(1) |
77
+ cdll.headnode() | O(1) |
78
+ cdll.tailnode() | O(1) |
71
79
72
80
# 小问题:
73
81
- 这里单链表我没有实现 insert 方法,你能自己尝试实现吗? insert(value, new_value),我想在某个值之前插入一个值。你同样需要先查找,所以这个步骤也不够高效。
Original file line number Diff line number Diff line change @@ -57,6 +57,7 @@ for i in range(100):
57
57
print (i % maxsize)
58
58
```
59
59
60
+ ![ ] ( ./array_queue.png )
60
61
61
62
我们来实现一个空间有限的循环队列。ArrayQueue,它的实现很简单,但是缺点是需要预先知道队列的长度来分配内存。
62
63
@@ -78,7 +79,7 @@ for i in range(100):
78
79
- remove(node) # O(1)
79
80
80
81
啊哈,似乎删除头尾都可以啦,而且都是 O(1) 的,完美。
81
- 交给你一个艰巨的任务,实现双端队列 Deque() ADT。你可以参考前几章的任何代码,挑战一下这个任务,别忘记写单元测试呦
82
+ 交给你一个艰巨的任务,实现双端队列 Deque() ADT。你可以参考前几章的任何代码,挑战一下这个任务,别忘记写单元测试呦。当然如果没想出来也没关系,后边我们实现栈的时候还会用到它,那里我们会实现这个代码。
82
83
83
84
84
85
# 思考题
You can’t perform that action at this time.
0 commit comments