1. 各种排序方式:
需要记忆
常用的排序算法:选炮插,快归西堆统计鸡
最重要的排序算法:插堆快归
2. 递归行为:
任何递归行为都可以变成非递归,改为迭代
public int fun(a,b) { // 这是跳出fun函数递归的条件 if (a == b) { return xx; } int mid = xxx; int a = fun (a, mid); int b = fun (mid+1, b); return Math.max(a,b); }
2.1 Master公式计算递归时间复杂度:
T ( N ) = a ∗ T ( N / b ) + O ( N ∧ d ) ( 其中的 a , b , d , 的递归函数,可以直接通过Master公式来确定时间复杂度 \begin{array}{l} T(N)=a * T(N / b)+O\left(N^{\wedge} d\right)\\\\(\text{ 其中的 } a, b, d \text { , } \text { 的递归函数,可以直接通过Master公式来确定时间复杂度 } \end{array} T(N)=a∗T(N/b)+O(N∧d)( 其中的 a,b,d , 的递归函数,可以直接通过Master公式来确定时间复杂度
得到以下通式:
1) log b a > d O ( N l o g b a ) 2) log b a > d O ( N d ) 3) log b a = = d O ( N d ∗ log n ) \begin{array}{l} \text { 1) } \left.\log _{b} a>d \quad \quad O ({N}^{{ log }_{b} a}\right) \\ \text { 2) } \log _{b} a > d \quad \quad O\left(N^{d}\right) \\ \text { 3) } \text { log }_{b} a==d \quad O\left(N^{d} * \log _{n}\right) \end{array} 1) logba>dO(Nlogba) 2) logba>dO(Nd) 3) log ba==dO(Nd∗logn)
Tip:
a 是调用的次数
b 是问题规模,
d 是除了递归过程之外的时间复杂度的值
3. 哈希表
3.1 HashMap 和 HashSet的区别
HashMap <key, value> put () remove () containskey () HashSet <key> add() contains() remove()
HashMap 和 HashSet的区别在于是否存在 value;
对于这个表的操作时间复杂度均为 O(1)
3.2 引用传递和值传递
public static void main(String[] args) { Integer a = 1000000; Integer b = 1000000; //包装类型间的相等判断应该用equals,而不是'==' System.out.println(a == b); System.out.println(a.equals(b)); Integer c = 127; Integer d = 127; //包装类型间的相等判断应该用equals,而不是'==' System.out.println(c == d); System.out.println(c.equals(d)); } result : "A:\Program Files\Java\jdk-12.0.1\bin\java.exe" - false true true true
-128 ~ 127内的数字都会变成池里面的东西,和标准的字面值一样。
3.3 与HashMap的不同:
HashMap 中的 <Integer, String>是采用值传递的。
非基础类key是用引用传递,()内存地址。
4. 有序表:TreeMap <Integer, String >
自然排序,可以乱序插入,但是结果还是有序的,而且可以获取第一个,最后一个元素。
但是里面的操作都是O(n)的时间复杂度。
AVL、SB、红黑树、跳表
平衡性都是不同的,搜索二叉树。内部结构其实是有序的。