参考视频
1.类型一:时间复杂度为对数(while)
void func(int n){
int i = 1;
while(i<=n){
i = i*2;
}
}
设循环体次数
T(n):
i = 1,2,4,....,2的T(n)方
2的T(n)方 <= n
T(n) = log2(n)
void func(int n){
int i = 0,sum = 0;
while(sum<n)sum+=++i;
return i;
}
设循环体次数
T(n):
i = 0,1,2,4,....,T(n)
sum = 0,1,3,7,....,(T(n)*(T(n)+1))/2
(T(n)*(T(n)+1))/2<= n
T(n)² = 2n
T(n) = o(n的1/2)
2.类型二:嵌套循环(for)
void func(int n){
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < 2*i; ++j)
{
m++;
}
}
}
-----------------
n 2i n
∑ ∑ 1 = 2∑ i = n(n+1)
i=1 j=1 i=1
//只看阶数最高
T(n) = O(n²)
void func(int n){
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
a[i][j] = 0;
}
}
}
--------
n-1 m-1 n-1
∑ ∑ 1 = ∑ m = n*m
i=0 j=0 i=0
T(n) = O(n*m)
3.类型三:混合(不单纯for)
分别求出相乘
count = 0;
for (int k = 0; k < n; k*=2)
{
for (int j = 0; j < n; ++j)
{
count++;
}
}
--------
(最外层)设循环体次数
T(n):
K = 1,2,4,....,2的T(n)方
2的T(n)方 <= n
T(n) = log2(n)
n
∑ 1 = n;
j=1
T(n)= n*log2(n);
4.类型四:递归(较难,选择题考的少,暂不总结)
【真题统计】
2022.1 求时间复杂度:类型二
2019.1 求时间复杂度:类型一
个人觉得链表选择题较少,循环链表可以关注一下
一般送分,不予详解。
队空 | Q.front == Q.rear |
队满 | Q.front == (Q.rear + 1) % maxSize |
队内元素数 | (rear-front+maxSize )%maxSize(rear大于front时)|| (front + maxSize - rear) % maxSize (front大于rear时) |
入队 | Q.rear = (Q.rear + 1) % maxSize; //rear指针前移 |
出队 | Q.front = ((Q.front + 1) % maxSize); //front指针前移 |
总结点数 | n0+n1+n2+…+nm |
总分支数 | 1n1+2n2+…+m*nm |
总结点数 | 总分支数 +1 |
递归和迭代的算法
讲解视频
注意:树转换的二叉树没有右子树
将所有树的根节点视为兄弟节点
引入的目的:为了加快查找结点前去和后继的速度
0左右孩子1前驱后继
定义:
参考
插入
左小右大,从根结点开始比较
删除
定义:
参考视频,此处不做详细总结
插入:
删除:
无向图–连通:
有向图–强连通:
算法
算法
Kruskal算法
不断选取当前位被选中的最小的边;适合边稀疏图
[单源最短路径]BFS算法(无权图)
BFS算法求最短路径的局限:仅能求无权图或者各条边权值都相同的图
[单源最短路径]Dijkstra算法(带权图、无权图)
数组final[]-------标记是否已经找到最短路径
辅助数组dist[] -----最短路径长度
辅助数组path[]-----路径上的前驱
第一轮:从第一个顶点开始寻找所有前驱为自身且可到达的结点以及权值,然后修改dist[]和path[],并将final[]自己的索引置为true.
第二轮:在final[]找未作为起点寻找过的且dist[]最小的顶点(上一个顶点找到的最小权值顶点),重复第一轮。
[各顶点间最短路径]Floyd算法(带权图、无权图)
动态规划思想,n轮求解
参考视频
AOV网(有向无环图)
AOE网
过程:
代码
for循环查询
顺序查找的优化,前提是序列有序
序列:(7,10,13,16,19,29,32,33,37,41,43) 查找33
第一轮:low = 0;high =10;mid =(low+high)/2 = 5;找到29
第二轮:low = 5+1;high =10;mid =(low+high)/2 = 8;找到37
第三轮:low = 5+1;high =7;mid =(low+high)/2 = 6;找到32
第三四轮:low = 7;high =7;mid =(low+high)/2 = 6;找到33,查找成功
特点:块内无序、块间有序
10 20 30 40 50 有序
(7,10)(13,19,16,20)(27,22,30)(40,36)(43.50.48) 无序
找22,在第三个分块里找,遍历
装填因子:表中记录数/散列表长度(装填因子越大,发生冲突概率越高,散列表查找效率越低)
平均成功查找长度:
平均失败查找长度:
1.除留余数法—H(key) = key % p
2.直接定址法—H(key) = key 或者 H(key) = a *key+b
3.数字分析法
4.平方取中法
1.开放定址法 Hi = (H(key)+di)%m
2.拉链法
算法思想:每次将该元素按照其大小插入到前面已有序的序列中(将数组中第一个元素视为有序,因此从第二个元素开始)
//序列变化
5| 2 4 6 1 3
2 5| 4 6 1 3
2 4 5| 6 1 3
2 4 5 6| 1 3
1 2 4 5 6| 3
1 2 3 4 5 6|
插入到前面已有序的序列中采用折半查找法
插入排序的优化升级
49,38,65,97,76,13,27,49
gap=length/2=4
{49,76}{13,36}{27,65}{49,97}--- 49,13,27,49,76,38,65,97
gap=length/2=2
{27,49,65,76}{13,8,49,97}--- 27,13,49,38,65,49,76,97(已基本有序)
gap=length/2=1
13,27,38,49,49,65,76,97
每轮确定一个数的最终位置
//以序列 46 30 82 90 56 17 95 15 共8个元素
初始状态:
46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7
i = 0 j = 7
15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1
i = 1 j = 7
15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2
i = 2 j = 7
15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6
i = 2 j = 6
15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5
i = 2 j = 5
15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3
i = 3 j = 5
15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4
3 = i j = 4
15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3
i = j = 3
堆本质上是一颗完全二叉树
从左到右,从下到上
一轮确定一个,和数组尾元素互换
算法思想:将相邻的两个有序表归并为一个有序表
49,38,65,97,76,13,27
一次归并:{38,49}{65.97}{13.76}{27}
二次归并:{38,49,65,97,}{13,27,76}
三次归并:{13,27,38,49,65,76,97}
基数排序:
原始序列:211,438,888,007,111,985,666,996,233,168,
以个位递减:
438,888,168,007,666,996,985,233,211,111,520,
以十位递减:
996,888,985,168,666,438,233,530,211,111,007
以百位递减:
996,985,888,666,520,438,233,211,168,111,007
时间复杂度(最好) | 时间复杂度(平均) | 时间复杂度(最坏) | 空间复杂度 | 是否稳定 | |
---|---|---|---|---|---|
直接插入排序 | O(n) | O(n²) | O(n²) | O(1) | 是 |
冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 是 |
简单选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 否 |
希尔排序 | O(1) | 否 | |||
快速排序 | O(nlog2(n)) | O(nlog2(n)) | O(n²) | O(log2(n)) | 否 |
堆排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(1) | 否 |
二路归并排序 | O(nlog2(n)) | O(nlog2(n)) | O(nlog2(n)) | O(n) | 是 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O® | 是 |
待做: