Skip to content

Commit 872521f

Browse files
suifengtectrekhleb
authored andcommittedAug 30, 2018
Partial translation of Simplified Chinese (trekhleb#185)
* init * init * init * init
1 parent 68af4fc commit 872521f

File tree

11 files changed

+395
-9
lines changed

11 files changed

+395
-9
lines changed
 

‎README.zh-CN.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ _Read this in other languages:_
2222

2323
`B` - 初学者, `A` - 进阶
2424

25-
* `B` [链表](src/data-structures/linked-list)
26-
* `B` [双向链表](src/data-structures/doubly-linked-list)
27-
* `B` [队列](src/data-structures/queue)
28-
* `B` [](src/data-structures/stack)
29-
* `B` [哈希表](src/data-structures/hash-table)
30-
* `B` [](src/data-structures/heap)
31-
* `B` [优先队列](src/data-structures/priority-queue)
25+
* `B` [链表](src/data-structures/linked-list/README.zh-CN.md)
26+
* `B` [双向链表](src/data-structures/doubly-linked-list/README.zh-CN.md)
27+
* `B` [队列](src/data-structures/queue/README.zh-CN.md)
28+
* `B` [](src/data-structures/stack/README.zh-CN.md)
29+
* `B` [哈希表](src/data-structures/hash-table/README.zh-CN.md)
30+
* `B` [](src/data-structures/heap/README.zh-CN.md)
31+
* `B` [优先队列](src/data-structures/priority-queue/README.zh-CN.md)
3232
* `A` [字典树](src/data-structures/trie)
33-
* `A` [](src/data-structures/tree)
33+
* `A` [](src/data-structures/tree/README.zh-CN.md)
3434
* `A` [二叉查找树](src/data-structures/tree/binary-search-tree)
3535
* `A` [AVL 树](src/data-structures/tree/avl-tree)
3636
* `A` [红黑树](src/data-structures/tree/red-black-tree)
3737
* `A` [线段树](src/data-structures/tree/segment-tree) - 使用 最小/最大/总和 范围查询示例
3838
* `A` [树状数组](src/data-structures/tree/fenwick-tree) (二叉索引树)
39-
* `A` [](src/data-structures/graph) (有向图与无向图)
39+
* `A` [](src/data-structures/graph/README.zh-CN.md) (有向图与无向图)
4040
* `A` [并查集](src/data-structures/disjoint-set)
4141
* `A` [布隆过滤器](src/data-structures/bloom-filter)
4242

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# 双向链表
2+
3+
在计算机科学中, 一个 **双向链表(doubly linked list)** 是由一组称为节点的顺序链接记录组成的链接数据结构。每个节点包含两个字段,称为链接,它们是对节点序列中上一个节点和下一个节点的引用。开始节点和结束节点的上一个链接和下一个链接分别指向某种终止节点,通常是前哨节点或null,以方便遍历列表。如果只有一个前哨节点,则列表通过前哨节点循环链接。它可以被概念化为两个由相同数据项组成的单链表,但顺序相反。
4+
5+
![Doubly Linked List](https://upload.wikimedia.org/wikipedia/commons/5/5e/Doubly-linked-list.svg)
6+
7+
两个节点链接允许在任一方向上遍历列表。
8+
9+
在双向链表中进行添加或者删除节点时,需做的链接更改要比单向链表复杂得多。这种操作在单向链表中更简单高效,因为不需要关注一个节点(除第一个和最后一个节点以外的节点)的两个链接,而只需要关注一个链接即可。
10+
11+
12+
13+
## 基础操作的伪代码
14+
15+
### 插入
16+
17+
```text
18+
Add(value)
19+
Pre: value is the value to add to the list
20+
Post: value has been placed at the tail of the list
21+
n ← node(value)
22+
if head = ø
23+
head ← n
24+
tail ← n
25+
else
26+
n.previous ← tail
27+
tail.next ← n
28+
tail ← n
29+
end if
30+
end Add
31+
```
32+
33+
### 删除
34+
35+
```text
36+
Remove(head, value)
37+
Pre: head is the head node in the list
38+
value is the value to remove from the list
39+
Post: value is removed from the list, true; otherwise false
40+
if head = ø
41+
return false
42+
end if
43+
if value = head.value
44+
if head = tail
45+
head ← ø
46+
tail ← ø
47+
else
48+
head ← head.Next
49+
head.previous ← ø
50+
end if
51+
return true
52+
end if
53+
n ← head.next
54+
while n = ø and value = n.value
55+
n ← n.next
56+
end while
57+
if n = tail
58+
tail ← tail.previous
59+
tail.next ← ø
60+
return true
61+
else if n = ø
62+
n.previous.next ← n.next
63+
n.next.previous ← n.previous
64+
return true
65+
end if
66+
return false
67+
end Remove
68+
```
69+
70+
### 反向遍历
71+
72+
```text
73+
ReverseTraversal(tail)
74+
Pre: tail is the node of the list to traverse
75+
Post: the list has been traversed in reverse order
76+
n ← tail
77+
while n = ø
78+
yield n.value
79+
n ← n.previous
80+
end while
81+
end Reverse Traversal
82+
```
83+
84+
## 复杂度
85+
86+
## 时间复杂度
87+
88+
| Access | Search | Insertion | Deletion |
89+
| :-------: | :-------: | :-------: | :-------: |
90+
| O(n) | O(n) | O(1) | O(1) |
91+
92+
### 空间复杂度
93+
94+
O(n)
95+
96+
## 参考
97+
98+
- [Wikipedia](https://en.wikipedia.org/wiki/Doubly_linked_list)
99+
- [YouTube](https://www.youtube.com/watch?v=JdQeNxWCguQ&t=7s&index=72&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#
2+
3+
在计算机科学中, **图(graph)** 是一种抽象数据类型,
4+
旨在实现数学中的无向图和有向图概念,特别是图论领域。
5+
6+
一个图数据结构是一个(由有限个或者可变数量的)顶点/节点/点和边构成的有限集。
7+
8+
如果顶点对之间是无序的,称为无序图,否则称为有序图;
9+
10+
如果顶点对之间的边是没有方向的,称为无向图,否则称为有向图;
11+
12+
如果顶点对之间的边是有权重的,该图可称为加权图。
13+
14+
15+
16+
![Graph](https://www.tutorialspoint.com/data_structures_algorithms/images/graph.jpg)
17+
18+
## 参考
19+
20+
- [Wikipedia](https://en.wikipedia.org/wiki/Graph_(abstract_data_type))
21+
- [Introduction to Graphs on YouTube](https://www.youtube.com/watch?v=gXgEDyodOJU&index=9&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
22+
- [Graphs representation on YouTube](https://www.youtube.com/watch?v=k1wraWzqtvQ&index=10&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 哈希表
2+
3+
在计算中, 一个 **哈希表(hash table 或hash map)** 是一种实现 *关联数组(associative array)*
4+
的抽象数据;类型, 该结构可以将 *键映射到值*
5+
6+
哈希表使用 *哈希函数/散列函数* 来计算一个值在数组或桶(buckets)中或槽(slots)中对应的索引,可使用该索引找到所需的值。
7+
8+
理想情况下,散列函数将为每个键分配给一个唯一的桶(bucket),但是大多数哈希表设计采用不完美的散列函数,这可能会导致"哈希冲突(hash collisions)",也就是散列函数为多个键(key)生成了相同的索引,这种碰撞必须
9+
以某种方式进行处理。
10+
11+
12+
![Hash Table](https://upload.wikimedia.org/wikipedia/commons/7/7d/Hash_table_3_1_1_0_1_0_0_SP.svg)
13+
14+
通过单独的链接解决哈希冲突
15+
16+
![Hash Collision](https://upload.wikimedia.org/wikipedia/commons/d/d0/Hash_table_5_0_1_1_1_1_1_LL.svg)
17+
18+
## 参考
19+
20+
- [Wikipedia](https://en.wikipedia.org/wiki/Hash_table)
21+
- [YouTube](https://www.youtube.com/watch?v=shs0KM3wKv8&index=4&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# 堆 (数据结构)
2+
3+
在计算机科学中, 一个 ** 堆(heap)** 是一种特殊的基于树的数据结构,它满足下面描述的堆属性。
4+
5+
在一个 *最小堆(min heap)* 中, 如果 `P``C` 的一个父级节点, 那么 `P` 的key(或value)应小于或等于 `C` 的对应值.
6+
7+
![最小堆](https://upload.wikimedia.org/wikipedia/commons/6/69/Min-heap.png)
8+
9+
在一个 *最大堆(max heap)* 中, `P` 的key(或value)大于 `C` 的对应值。
10+
11+
![](https://upload.wikimedia.org/wikipedia/commons/3/38/Max-Heap.svg)
12+
13+
14+
在堆“顶部”的没有父级节点的节点,被称之为根节点。
15+
16+
## 参考
17+
18+
- [Wikipedia](https://en.wikipedia.org/wiki/Heap_(data_structure))
19+
- [YouTube](https://www.youtube.com/watch?v=t0Cq6tVNRBA&index=5&t=0s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# 链表
2+
3+
在计算机科学中, 一个 **链表** 是数据元素的线性集合, 元素的线性顺序不是由它们在内存中的物理位置给出的。 相反, 每个元素指向下一个元素。它是由一组节点组成的数据结构,这些节点一起,表示序列。
4+
5+
在最简单的形式下,每个节点由数据和到序列中下一个节点的引用(换句话说,链接)组成。这种结构允许在迭代期间有效地从序列中的任何位置插入或删除元素。
6+
7+
更复杂的变体添加额外的链接,允许有效地插入或删除任意元素引用。链表的一个缺点是访问时间是线性的(而且难以管道化)。
8+
9+
更快的访问,如随机访问,是不可行的。与链表相比,数组具有更好的缓存位置。
10+
11+
![Linked List](https://upload.wikimedia.org/wikipedia/commons/6/6d/Singly-linked-list.svg)
12+
13+
## 基本操作的伪代码
14+
15+
### 插入
16+
17+
```text
18+
Add(value)
19+
Pre: value is the value to add to the list
20+
Post: value has been placed at the tail of the list
21+
n ← node(value)
22+
if head = ø
23+
head ← n
24+
tail ← n
25+
else
26+
tail.next ← n
27+
tail ← n
28+
end if
29+
end Add
30+
```
31+
32+
### 搜索
33+
34+
```text
35+
Contains(head, value)
36+
Pre: head is the head node in the list
37+
value is the value to search for
38+
Post: the item is either in the linked list, true; otherwise false
39+
n ← head
40+
while n != ø and n.value != value
41+
n ← n.next
42+
end while
43+
if n = ø
44+
return false
45+
end if
46+
return true
47+
end Contains
48+
```
49+
50+
### 删除
51+
52+
```text
53+
Remove(head, value)
54+
Pre: head is the head node in the list
55+
value is the value to remove from the list
56+
Post: value is removed from the list, true, otherwise false
57+
if head = ø
58+
return false
59+
end if
60+
n ← head
61+
if n.value = value
62+
if head = tail
63+
head ← ø
64+
tail ← ø
65+
else
66+
head ← head.next
67+
end if
68+
return true
69+
end if
70+
while n.next = ø and n.next.value = value
71+
n ← n.next
72+
end while
73+
if n.next = ø
74+
if n.next = tail
75+
tail ← n
76+
end if
77+
n.next ← n.next.next
78+
return true
79+
end if
80+
return false
81+
end Remove
82+
```
83+
84+
### 遍历
85+
86+
```text
87+
Traverse(head)
88+
Pre: head is the head node in the list
89+
Post: the items in the list have been traversed
90+
n ← head
91+
while n = 0
92+
yield n.value
93+
n ← n.next
94+
end while
95+
end Traverse
96+
```
97+
98+
### 反向遍历
99+
100+
```text
101+
ReverseTraversal(head, tail)
102+
Pre: head and tail belong to the same list
103+
Post: the items in the list have been traversed in reverse order
104+
if tail = ø
105+
curr ← tail
106+
while curr = head
107+
prev ← head
108+
while prev.next = curr
109+
prev ← prev.next
110+
end while
111+
yield curr.value
112+
curr ← prev
113+
end while
114+
yeild curr.value
115+
end if
116+
end ReverseTraversal
117+
```
118+
119+
## 复杂度
120+
121+
### 时间复杂度
122+
123+
| Access | Search | Insertion | Deletion |
124+
| :-------: | :-------: | :-------: | :-------: |
125+
| O(n) | O(n) | O(1) | O(1) |
126+
127+
### 空间复杂度
128+
129+
O(n)
130+
131+
## 参考
132+
133+
- [Wikipedia](https://en.wikipedia.org/wiki/Linked_list)
134+
- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# 优先队列
2+
3+
在计算机科学中, **优先级队列(priority queue)** 是一种抽象数据类型, 它类似于常规的队列或栈, 但每个元素都有与之关联的“优先级”。
4+
5+
在优先队列中, 低优先级的元素之前前面应该是高优先级的元素。 如果两个元素具有相同的优先级, 则根据它们在队列中的顺序是它们的出现顺序即可。
6+
7+
优先队列虽通常用堆来实现,但它在概念上与堆不同。优先队列是一个抽象概念,就像“列表”或“图”这样的抽象概念一样;
8+
9+
正如列表可以用链表或数组实现一样,优先队列可以用堆或各种其他方法实现,例如无序数组。
10+
11+
12+
## 参考
13+
14+
- [Wikipedia](https://en.wikipedia.org/wiki/Priority_queue)
15+
- [YouTube](https://www.youtube.com/watch?v=wptevk0bshY&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=6)
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# 队列
2+
3+
在计算机科学中, 一个 **队列(queue)** 是一种特殊类型的抽象数据类型或集合。集合中的实体按顺序保存。
4+
5+
队列基本操作有两种: 向队列的后端位置添加实体,称为入队,并从队列的前端位置移除实体,称为出队。
6+
7+
8+
队列中元素先进先出 FIFO (first in, first out)的示意
9+
10+
![Queue](https://upload.wikimedia.org/wikipedia/commons/5/52/Data_Queue.svg)
11+
12+
## 参考
13+
14+
- [Wikipedia](https://en.wikipedia.org/wiki/Queue_(abstract_data_type))
15+
- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&)
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#
2+
3+
在计算机科学中, 一个 **栈(stack)** 时一种抽象数据类型,用作表示元素的集合,具有两种主要操作:
4+
5+
* **push**, 添加元素到栈的顶端(末尾);
6+
* **pop**, 移除栈最顶端(末尾)的元素.
7+
8+
以上两种操作可以简单概括为“后进先出(LIFO = last in, first out)”。
9+
10+
此外,应有一个 `peek` 操作用于访问栈当前顶端(末尾)的元素。
11+
12+
"栈"这个名称,可类比于一组物体的堆叠(一摞书,一摞盘子之类的)。
13+
14+
栈的 push 和 pop 操作的示意
15+
16+
![Stack](https://upload.wikimedia.org/wikipedia/commons/b/b4/Lifo_stack.png)
17+
18+
## 参考
19+
20+
- [Wikipedia](https://en.wikipedia.org/wiki/Stack_(abstract_data_type))
21+
- [YouTube](https://www.youtube.com/watch?v=wjI1WNcIntg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=3&)
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#
2+
3+
* [二叉搜索树](binary-search-tree)
4+
* [AVL树](avl-tree)
5+
* [红黑树](red-black-tree)
6+
* [线段树](segment-tree) - with min/max/sum range queries examples
7+
* [芬威克树/Fenwick Tree](fenwick-tree) (Binary Indexed Tree)
8+
9+
在计算机科学中, **树(tree)** 是一种广泛使用的抽象数据类型(ADT)— 或实现此ADT的数据结构 — 模拟分层树结构, 具有根节点和有父节点的子树,表示为一组链接节点。
10+
11+
树可以被(本地地)递归定义为一个(始于一个根节点的)节点集, 每个节点都是一个包含了值的数据结构, 除了值,还有该节点的节点引用列表(子节点)一起。
12+
树的节点之间没有引用重复的约束。
13+
14+
一棵简单的无序树; 在下图中:
15+
16+
标记为7的节点具有两个子节点, 标记为2和6;
17+
一个父节点,标记为2,作为根节点, 在顶部,没有父节点。
18+
19+
![Tree](https://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg)
20+
21+
## 参考
22+
23+
- [Wikipedia](https://en.wikipedia.org/wiki/Tree_(data_structure))
24+
- [YouTube](https://www.youtube.com/watch?v=oSWTXtMglKE&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=8)
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# 字典树
2+
3+
在计算机科学中, **字典树(trie,中文又被称为”单词查找树“或 ”键树“)**, 也称为数字树,有时候也被称为基数树或前缀树(因为它们可以通过前缀搜索),它是一种搜索树--一种已排序的数据结构,通常用于存储动态集或键为字符串的关联数组。
4+
5+
与二叉搜索树不同, 树上没有节点存储与该节点关联的键; 相反,节点在树上的位置定义了与之关联的键。一个节点的全部后代节点都有一个与该节点关联的通用的字符串前缀, 与根节点关联的是空字符串。
6+
7+
值对于字典树中关联的节点来说,不是必需的,相反,值往往和相关的叶子相关,以及与一些键相关的内部节点相关。
8+
9+
有关字典树的空间优化示意,请参阅紧凑前缀树
10+
11+
![Trie](https://upload.wikimedia.org/wikipedia/commons/b/be/Trie_example.svg)
12+
13+
## 参考
14+
15+
- [Wikipedia](https://en.wikipedia.org/wiki/Trie)
16+
- [YouTube](https://www.youtube.com/watch?v=zIjfhVPRZCg&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8&index=7&t=0s)

0 commit comments

Comments
 (0)
Please sign in to comment.