diff --git a/notes/算法 - 算法分析.md b/notes/算法 - 算法分析.md
index 2b53c6b1..e59d646c 100644
--- a/notes/算法 - 算法分析.md
+++ b/notes/算法 - 算法分析.md
@@ -23,43 +23,43 @@
## 数学模型
-### 1. 近似
+### 1. 近似
N3/6-N2/2+N/3 \~ N3/6。使用 \~f(N) 来表示所有随着 N 的增大除以 f(N) 的结果趋近于 1 的函数。
-### 2. 增长数量级
+### 2. 增长数量级
N3/6-N2/2+N/3 的增长数量级为 O(N3)。增长数量级将算法与它的具体实现隔离开来,一个算法的增长数量级为 O(N3) 与它是否用 Java 实现,是否运行于特定计算机上无关。
-### 3. 内循环
+### 3. 内循环
执行最频繁的指令决定了程序执行的总时间,把这些指令称为程序的内循环。
-### 4. 成本模型
+### 4. 成本模型
使用成本模型来评估算法,例如数组的访问次数就是一种成本模型。
## 注意事项
-### 1. 大常数
+### 1. 大常数
在求近似时,如果低级项的常数系数很大,那么近似的结果是错误的。
-### 2. 缓存
+### 2. 缓存
计算机系统会使用缓存技术来组织内存,访问数组相邻的元素会比访问不相邻的元素快很多。
-### 3. 对最坏情况下的性能的保证
+### 3. 对最坏情况下的性能的保证
在核反应堆、心脏起搏器或者刹车控制器中的软件,最坏情况下的性能是十分重要的。
-### 4. 随机化算法
+### 4. 随机化算法
通过打乱输入,去除算法对输入的依赖。
-### 5. 均摊分析
+### 5. 均摊分析
-将所有操作的总成本除于操作总数来将成本均摊。例如对一个空栈进行 N 次连续的 push() 调用需要访问数组的次数为 N+4+8+16+...+2N=5N-4(N 是向数组写入元素的次数,其余都是调整数组大小时进行复制需要的访问数组次数),均摊后访问数组的平均次数为常数。
+将所有操作的总成本除以操作总数来将成本均摊。例如对一个空栈进行 N 次连续的 push() 调用需要访问数组的次数为 N+4+8+16+...+2N=5N-4(N 是向数组写入元素的次数,其余都是调整数组大小时进行复制需要的访问数组次数),均摊后访问数组的平均次数为常数。
## ThreeSum
@@ -71,7 +71,7 @@ public interface ThreeSum {
}
```
-### 1. ThreeSumSlow
+### 1. ThreeSumSlow
该算法的内循环为 `if (nums[i] + nums[j] + nums[k] == 0)` 语句,总共执行的次数为 N(N-1)(N-2)/6 = N3/6-N2/2+N/3,因此它的近似执行次数为 \~N3/6,增长数量级为 O(N3)。
@@ -95,7 +95,7 @@ public class ThreeSumSlow implements ThreeSum {
}
```
-### 2. ThreeSumBinarySearch
+### 2. ThreeSumBinarySearch
将数组进行排序,对两个元素求和,并用二分查找方法查找是否存在该和的相反数,如果存在,就说明存在和为 0 的三元组。
@@ -146,7 +146,7 @@ public class BinarySearch {
}
```
-### 3. ThreeSumTwoPointer
+### 3. ThreeSumTwoPointer
更有效的方法是先将数组排序,然后使用双指针进行查找,时间复杂度为 O(N2)。
@@ -233,7 +233,7 @@ public class StopWatch {
public static double elapsedTime() {
long now = System.currentTimeMillis();
- return (now - start) / 1000.0;
+ return now - start;
}
}
```