diff --git a/notes/算法.md b/notes/算法.md
index 9377a9ab..b4d8893a 100644
--- a/notes/算法.md
+++ b/notes/算法.md
@@ -127,7 +127,7 @@ public class ThreeSumFast {
-可以看到,T(2N)/T(N) \~ 23,因此可以确定 T(N) \~ aN2logN。
+可以看到,T(2N)/T(N) \~ 23,因此可以确定 T(N) \~ aN3logN。
## 注意事项
@@ -610,7 +610,7 @@ private static void sort(Comparable[] a, int lo, int hi) {
因为每次都将问题对半分成两个子问题,而这种对半分的算法复杂度一般为 O(NlogN),因此该归并排序方法的时间复杂度也为 O(NlogN)。
-因为小数组的递归操作会过于频繁,因此可以在数组过小时切换到插入排序来提高性能。
+小数组的递归操作会过于频繁,可以在数组过小时切换到插入排序来提高性能。
### 3. 自底向上归并排序
@@ -855,7 +855,7 @@ public static void sort(Comparable[] a){
-快速排序时最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。
+快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。
### 2. Java 的排序算法实现
@@ -902,7 +902,7 @@ public static Comparable select(Comparable[] a, int k) {
### 3. 二分查找实现有序符号表
-使用一对平行数组,一个存储键一个存储值。其中键的数组为 Comparable 数组,值的数字为 Object 数组。
+使用一对平行数组,一个存储键一个存储值。其中键的数组为 Comparable 数组,值的数组为 Object 数组。
rank() 方法至关重要,当键在表中时,它能够知道该键的位置;当键不在表中时,它也能知道在何处插入新键。
@@ -1016,7 +1016,7 @@ public class BST, Value> {
- 如果被查找的键和根节点的键相等,查找命中;
- 否则递归地在子树中查找:如果被查找的键较小就在左子树中查找,较大就在右子树中查找。
-BST 的查找操作每次递归都会让区间减少一半,和二分查找类似,因此查找的复杂度为 O(logn)。
+BST 的查找操作每次递归都会让区间减少一半,和二分查找类似,因此查找的复杂度为 O(logN)。
```java
public Value get(Key key) {
@@ -1567,7 +1567,7 @@ private void resize(int cap) {
}
```
-虽然每次重新调整数组都需要重新把每个键值对插入到散列表,但是从摊还分析的角度来看,所需要的代价却是很小的。从下图可以看出,每次数组长度加倍后,累计平均值都会增加 1,因为表中每个键都需要重新计算散列值,但是随后平均值会下降。
+虽然每次重新调整数组都需要重新把每个键值对插入到散列表,但是从摊还分析的角度来看,所需要的代价却是很小的。从下图可以看出,每次数组长度加倍后,累计平均值都会增加 1,这是因为散列表中每个键都需要重新计算散列值。随后平均值会下降。