diff --git a/notes/算法.md b/notes/算法.md
index 1f02fbc1..85d99464 100644
--- a/notes/算法.md
+++ b/notes/算法.md
@@ -91,11 +91,15 @@
## 1. 函数转换
-指数函数可以转换为线性函数,从而在函数图像上显示的更直观。
+指数函数可以转换为线性函数,从而在函数图像上显示的更直观。例如
-
=aN^3)
转换为
+
-
+可以在其两端同时取对数,得到:
+
+
+
+
## 2. 数学模型
@@ -103,13 +107,13 @@
使用 \~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数 , 例如 N3/6-N2/2+N/3 \~ N3/6。
-
+
**增长数量级**
增长数量级将算法与它的实现隔离开来,一个算法的增长数量级为 N3 与它是否用 Java 实现,是否运行于特定计算机上无关。
-
+
**内循环**
@@ -121,7 +125,8 @@
## 3. ThreeSum
-ThreeSum 程序用于统计一个数组中三元组的和为 0 的数量。
+ThreeSum 用于统计一个数组中三元组的和为 0 的数量。
+
```java
public class ThreeSum {
@@ -142,7 +147,7 @@ public class ThreeSum {
}
```
-该程序的内循环为 if (a[i] + a[j] + a[k] == 0) 语句,总共执行的次数为 N3/6 - N2/2 + N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 N3。
+该算法的内循环为`if (a[i] + a[j] + a[k] == 0)`语句,总共执行的次数为 N(N-1)(N-2) = N3/6 - N2/2 + N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 N3。
**改进**
@@ -159,7 +164,7 @@ public class ThreeSumFast {
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
// rank() 方法返回元素在数组中的下标,如果元素不存在,这里会返回 -1。
- // 应该注意这里的下标必须大于 j,这样就不会重复统计了。
+ // 应该注意这里的下标必须大于 j,否则会重复统计。
if (BinarySearch.rank(-a[i] - a[j], a) > j) {
cnt++;
}
@@ -172,11 +177,13 @@ public class ThreeSumFast {
## 4. 倍率实验
-如果 T(N) \~ aNblgN,那么 T(2N)/T(N) \~ 2b,例如对于暴力方法的 ThreeSum 算法,近似时间为 \~N3/6,对它进行倍率实验得到如下结果:
+如果 T(N) \~ aNblgN,那么 T(2N)/T(N) \~ 2b。
-
+例如对于暴力方法的 ThreeSum 算法,近似时间为 \~N3/6。进行如下实验:多次运行该算法,每次取的 N 值为前一次的两倍,统计每次执行的时间,并统计本次运行时间与前一次运行时间的比值,得到如下结果:
-可见 T(2N)/T(N)\~23,也就是 b 为 3。
+
+
+可以看到,T(2N)/T(N)\~23,因此可以确定 T(N) \~ aN2lgN。
## 5. 注意事项
@@ -204,6 +211,10 @@ public class ThreeSumFast {
## 1. 栈
+first-in-last-out(FILO)
+
+
+
**数组实现**
```java
@@ -312,6 +323,11 @@ public class Stack- {
```
## 2. 队列
+first-in-first-out(FIFO)
+
+
+
+
下面是队列的链表实现,需要维护 first 和 last 节点指针,分别指向队首和队尾。
这里需要考虑让哪个指针指针链表头部节点,哪个指针指向链表尾部节点。因为出队列操作需要让队首元素的下一个元素成为队首,就需要容易获取下一个元素,而链表的头部节点的 next 指针指向下一个元素,因此让队首指针 first 指针链表的开头。
@@ -365,11 +381,11 @@ public class Queue- {
用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连接。
-
+
**API**
-
+
**基本数据结构**
@@ -416,7 +432,7 @@ public class UF {
在 union 时只将触点的 id 值指向另一个触点 id 值,不直接用 id 来存储所属的连通分量。这样就构成一个倒置的树形结构,根节点需要指向自己。在进行查找一个节点所属的连通分量时,要一直向上查找直到根节点,并使用根节点的 id 值作为本连通分量的 id 值。
-
+
```java
public int find(int p) {
@@ -434,7 +450,7 @@ public class UF {
这种方法可以快速进行 union 操作,但是 find 操作和树高成正比,最坏的情况下树的高度为触点的数目。
-
+
## 3. 加权 quick-union 算法
@@ -442,7 +458,7 @@ public class UF {
理论研究证明,加权 quick-union 算法构造的树深度最多不超过 lgN。
-
+
```java
public class WeightedQuickUnionUF {
@@ -489,7 +505,7 @@ public class WeightedQuickUnionUF {
## 5. 各种 union-find 算法的比较
-
+
# 排序
diff --git a/pics/0e6cf8bd-b84e-4b3c-b79d-40d7dd54e120.png b/pics/0e6cf8bd-b84e-4b3c-b79d-40d7dd54e120.png
new file mode 100644
index 00000000..5d13a325
Binary files /dev/null and b/pics/0e6cf8bd-b84e-4b3c-b79d-40d7dd54e120.png differ
diff --git a/pics/0ed83061-9c1e-4df3-b15b-69aad5bfe9b8.png b/pics/0ed83061-9c1e-4df3-b15b-69aad5bfe9b8.png
new file mode 100644
index 00000000..f4e07915
Binary files /dev/null and b/pics/0ed83061-9c1e-4df3-b15b-69aad5bfe9b8.png differ
diff --git a/pics/1c237399-e322-4930-b5b4-a582b1ad8bda.png b/pics/1c237399-e322-4930-b5b4-a582b1ad8bda.png
new file mode 100644
index 00000000..aa8847fb
Binary files /dev/null and b/pics/1c237399-e322-4930-b5b4-a582b1ad8bda.png differ
diff --git a/pics/1dc67ff6-d29b-4864-baac-fd6b23f9b2ac.png b/pics/1dc67ff6-d29b-4864-baac-fd6b23f9b2ac.png
new file mode 100644
index 00000000..014e215c
Binary files /dev/null and b/pics/1dc67ff6-d29b-4864-baac-fd6b23f9b2ac.png differ
diff --git a/pics/521969c9-71f6-44a5-9c78-118530e5c135.png b/pics/521969c9-71f6-44a5-9c78-118530e5c135.png
new file mode 100644
index 00000000..7ab5ab5c
Binary files /dev/null and b/pics/521969c9-71f6-44a5-9c78-118530e5c135.png differ
diff --git a/pics/83575315-20b5-44a6-bf58-94460a141ffa.jpg b/pics/83575315-20b5-44a6-bf58-94460a141ffa.jpg
new file mode 100644
index 00000000..568338fb
Binary files /dev/null and b/pics/83575315-20b5-44a6-bf58-94460a141ffa.jpg differ
diff --git a/pics/8f1e2db5-a59b-4633-8b61-6b8b9505b8ea.png b/pics/8f1e2db5-a59b-4633-8b61-6b8b9505b8ea.png
new file mode 100644
index 00000000..e7d64cb2
Binary files /dev/null and b/pics/8f1e2db5-a59b-4633-8b61-6b8b9505b8ea.png differ
diff --git a/pics/9a30b932-f69f-40a1-9564-a1354ff8cf29.jpg b/pics/9a30b932-f69f-40a1-9564-a1354ff8cf29.jpg
new file mode 100644
index 00000000..573a533f
Binary files /dev/null and b/pics/9a30b932-f69f-40a1-9564-a1354ff8cf29.jpg differ
diff --git a/pics/c11f5e3a-7a28-4db7-87b1-29ba1a2f2d72.jpg b/pics/c11f5e3a-7a28-4db7-87b1-29ba1a2f2d72.jpg
new file mode 100644
index 00000000..1bc52926
Binary files /dev/null and b/pics/c11f5e3a-7a28-4db7-87b1-29ba1a2f2d72.jpg differ
diff --git a/pics/c64f91e2-f5a8-436b-8663-b8f3fba3e098.png b/pics/c64f91e2-f5a8-436b-8663-b8f3fba3e098.png
new file mode 100644
index 00000000..28e21068
Binary files /dev/null and b/pics/c64f91e2-f5a8-436b-8663-b8f3fba3e098.png differ
diff --git a/pics/cc3d855a-4281-445b-8f83-8f855458de19.png b/pics/cc3d855a-4281-445b-8f83-8f855458de19.png
new file mode 100644
index 00000000..95a60098
Binary files /dev/null and b/pics/cc3d855a-4281-445b-8f83-8f855458de19.png differ
diff --git a/pics/e1cd89d1-8973-41d0-8ea9-940d94c314d9.jpg b/pics/e1cd89d1-8973-41d0-8ea9-940d94c314d9.jpg
new file mode 100644
index 00000000..c4fb4f11
Binary files /dev/null and b/pics/e1cd89d1-8973-41d0-8ea9-940d94c314d9.jpg differ