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) logb​a>dO(Nlogb​a) 2) logb​a>dO(Nd) 3)  log b​a==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、红黑树、跳表

平衡性都是不同的,搜索二叉树。内部结构其实是有序的。