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,这是因为散列表中每个键都需要重新计算散列值。随后平均值会下降。