diff --git a/notes/算法.md b/notes/算法.md index 72d0daa6..18f46cf9 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -25,8 +25,7 @@ * [桶排序](#桶排序) * [基数排序](#基数排序) * [外部排序](#外部排序) - * [排序算法的比较](#排序算法的比较) - * [Java 的排序算法实现](#java-的排序算法实现) + * [小结](#小结) * [六、查找](#六查找) * [链表实现无序符号表](#链表实现无序符号表) * [二分查找实现有序符号表](#二分查找实现有序符号表) @@ -34,7 +33,7 @@ * [2-3 查找树](#2-3-查找树) * [红黑树](#红黑树) * [散列表](#散列表) - * [应用](#应用) + * [小结](#小结) * [参考资料](#参考资料) @@ -1108,7 +1107,9 @@ public class HeapSort { ## 外部排序 -## 排序算法的比较 +## 小结 + +### 1. 排序算法的比较 | 算法 | 稳定 | 原地排序 | 时间复杂度 | 空间复杂度 | 备注 | | :---: | :---: | :---: | :---: | :---: | :---: | @@ -1122,7 +1123,7 @@ public class HeapSort { 快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分快速排序,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。 -## Java 的排序算法实现 +### 2. Java 的排序算法实现 Java 主要排序方法为 java.util.Arrays.sort(),对于原始数据类型使用三向切分的快速排序,对于引用类型使用归并排序。 @@ -1974,17 +1975,18 @@ private void resize(int cap) { } ``` -## 应用 +## 小结 -### 1. 各种符号表实现的比较 +### 1. 符号表算法比较 | 算法 | 插入 | 查找 | 是否有序 | | :---: | :---: | :---: | :---: | | 二分查找实现的有序表 | N | logN | yes | | 二叉查找树 | logN | logN | yes | | 2-3 查找树 | logN | logN | yes | +| 链表实现的有序表 | N | N | no | | 拉链法实现的散列表 | N/M | N/M | no | -| 线性探测法试下的散列表 | 1 | 1 | no | +| 线性探测法实现的散列表 | 1 | 1 | no | 应当优先考虑散列表,当需要有序性操作时使用红黑树。 @@ -1993,11 +1995,7 @@ private void resize(int cap) { - java.util.TreeMap:红黑树 - java.util.HashMap:拉链法的散列表 -### 3. 集合类型 - -除了符号表,集合类型也经常使用,它只有键没有值,可以用集合类型来存储一系列的键然后判断一个键是否在集合中。 - -### 4. 稀疏向量乘法 +### 3. 稀疏向量乘法 当向量为稀疏向量时,可以使用符号表来存储向量中的非 0 索引和值,使得乘法运算只需要对那些非 0 元素进行即可。