auto commit
This commit is contained in:
parent
054a24a54b
commit
27c184f34e
12
notes/算法.md
12
notes/算法.md
|
@ -127,7 +127,7 @@ public class ThreeSumFast {
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//2093ccfa-e560-44f3-84c7-487d66451708.png" width="300"/> </div><br>
|
<div align="center"> <img src="../pics//2093ccfa-e560-44f3-84c7-487d66451708.png" width="300"/> </div><br>
|
||||||
|
|
||||||
可以看到,T(2N)/T(N) \~ 2<sup>3</sup>,因此可以确定 T(N) \~ aN<sup>2</sup>logN。
|
可以看到,T(2N)/T(N) \~ 2<sup>3</sup>,因此可以确定 T(N) \~ aN<sup>3</sup>logN。
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
|
@ -610,7 +610,7 @@ private static void sort(Comparable[] a, int lo, int hi) {
|
||||||
|
|
||||||
因为每次都将问题对半分成两个子问题,而这种对半分的算法复杂度一般为 O(NlogN),因此该归并排序方法的时间复杂度也为 O(NlogN)。
|
因为每次都将问题对半分成两个子问题,而这种对半分的算法复杂度一般为 O(NlogN),因此该归并排序方法的时间复杂度也为 O(NlogN)。
|
||||||
|
|
||||||
因为小数组的递归操作会过于频繁,因此可以在数组过小时切换到插入排序来提高性能。
|
小数组的递归操作会过于频繁,可以在数组过小时切换到插入排序来提高性能。
|
||||||
|
|
||||||
### 3. 自底向上归并排序
|
### 3. 自底向上归并排序
|
||||||
|
|
||||||
|
@ -855,7 +855,7 @@ public static void sort(Comparable[] a){
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//e4ca3383-910a-4936-8ac2-9e8fd31b736b.png" width="800"/> </div><br>
|
<div align="center"> <img src="../pics//e4ca3383-910a-4936-8ac2-9e8fd31b736b.png" width="800"/> </div><br>
|
||||||
|
|
||||||
快速排序时最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。
|
快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。
|
||||||
|
|
||||||
### 2. Java 的排序算法实现
|
### 2. Java 的排序算法实现
|
||||||
|
|
||||||
|
@ -902,7 +902,7 @@ public static Comparable select(Comparable[] a, int k) {
|
||||||
|
|
||||||
### 3. 二分查找实现有序符号表
|
### 3. 二分查找实现有序符号表
|
||||||
|
|
||||||
使用一对平行数组,一个存储键一个存储值。其中键的数组为 Comparable 数组,值的数字为 Object 数组。
|
使用一对平行数组,一个存储键一个存储值。其中键的数组为 Comparable 数组,值的数组为 Object 数组。
|
||||||
|
|
||||||
rank() 方法至关重要,当键在表中时,它能够知道该键的位置;当键不在表中时,它也能知道在何处插入新键。
|
rank() 方法至关重要,当键在表中时,它能够知道该键的位置;当键不在表中时,它也能知道在何处插入新键。
|
||||||
|
|
||||||
|
@ -1016,7 +1016,7 @@ public class BST<Key extends Comparable<Key>, Value> {
|
||||||
- 如果被查找的键和根节点的键相等,查找命中;
|
- 如果被查找的键和根节点的键相等,查找命中;
|
||||||
- 否则递归地在子树中查找:如果被查找的键较小就在左子树中查找,较大就在右子树中查找。
|
- 否则递归地在子树中查找:如果被查找的键较小就在左子树中查找,较大就在右子树中查找。
|
||||||
|
|
||||||
BST 的查找操作每次递归都会让区间减少一半,和二分查找类似,因此查找的复杂度为 O(logn)。
|
BST 的查找操作每次递归都会让区间减少一半,和二分查找类似,因此查找的复杂度为 O(logN)。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public Value get(Key key) {
|
public Value get(Key key) {
|
||||||
|
@ -1567,7 +1567,7 @@ private void resize(int cap) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
虽然每次重新调整数组都需要重新把每个键值对插入到散列表,但是从摊还分析的角度来看,所需要的代价却是很小的。从下图可以看出,每次数组长度加倍后,累计平均值都会增加 1,因为表中每个键都需要重新计算散列值,但是随后平均值会下降。
|
虽然每次重新调整数组都需要重新把每个键值对插入到散列表,但是从摊还分析的角度来看,所需要的代价却是很小的。从下图可以看出,每次数组长度加倍后,累计平均值都会增加 1,这是因为散列表中每个键都需要重新计算散列值。随后平均值会下降。
|
||||||
|
|
||||||
<div align="center"> <img src="../pics//d7c6c42d-a4d8-4b85-82fb-c21250bf5ca1.png" width="800"/> </div><br>
|
<div align="center"> <img src="../pics//d7c6c42d-a4d8-4b85-82fb-c21250bf5ca1.png" width="800"/> </div><br>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user