绪论
算法:是为了解决某类问题而规定的一个有限长的操作序列。
五个特性:有穷性、确定性、可行性、输入、输出
评价算法优劣的基本标准(4个):
正确性、可读性、健壮性、高效性及低存储量
常见的算法时间复杂度由小到大依次为:

常见时间复杂度




)、
栈和队列
前,中,后缀表达式
添加到第(N+1)个,移动平均:(0+1+2+……+N)/(N+1)=N/2
删除第N个,移动平均:[0+1+……+(N-1)]/N=(N-1)/2
环形队列
1、front:指向队列的第一个元素,即array[front]就是队列的第一个元素,front的初始值是0;
2、rear:指向队列的最后一个元素的后一个位置,空出一个空间做为约定(实际存储数据会比最大容量小1),rear的初始值是0;
3、maxSize:队列的最大容量;
4、队列满的条件是:(rear+1)%maxSize == front ;
5、队列为空的条件:rear == front;
6、队列中的有效数据个数:(rear + maxSize - front)% maxSize
数组和广义表



矩阵(稀疏矩阵)压缩存储(3种方式) (biancheng.net)
十字链表

串
子串长度:n(n+1)/2 + 1
树和二叉树
树的转换

二叉树转换为树:

森林转换为二叉树

二叉树转换为森林

二叉树的性质

性质1:树中的结点数等于所有结点的度数加1
每个结点的度数分别对应结点的子结点,所有结点的度数为b,因此结点数n = b +根节点,即n = b + 1.
性质2:度为m的树中第i层上至多有m的i-1次方个结点(i>=1)
本性质采用数学归纳法进行证明:
1)当树为第一层时,第一层至多有m0=1个结点
2)当树为第i-1层时,由该性质值第i-1层至多有mi-2个结点
3)当树为第i层时,由于树的度为m,可知每个第i-1层的每个结点至多有m个子结点,因此第i层至多有mi-2*m=mi-1个结点。
因此性质得证。
性质3:高度为h的m叉树至多有(m^h-1)/(m-1)个结点
由性质2可知,度为m的数第i层至多有mi-1个结点,因此高度为h的m叉树至多有n = m0+m1+…+mh-1个结点,用等比数列公式求和,可以得到n= (mh-1)/(m-1).
性质4:具有n个结点的m叉树的最小高度为⌈logm(n(m-1)+1)⌉
性质4是由性质3逆推得到,由得到最小高度可知树的每一层都具有最多结点。由于高度为整数,且多余结点也是一层,因此树的高度需要向上取整。
其他总结
二叉树中n0=n2+1
满二叉树n,高度为 log2(n+1)
n节点,空指针域n+1
n节点,分支树,或所有节点度之和为n-1
哈夫曼树
哈夫曼树中单节点分支为0,m为叶子结点数,节点总数为 2m-1
哈夫曼树权值计算
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积

线索二叉树

、

图
有向完全图:有n(n-1)条边的图,就是图中任意两点均有边相连的图。
完全图:有n(n-1)/2条边的图,就是图中任意两点均有边相连的图。
弧尾:边的始点称弧尾。
弧头:边的终点称弧头,即箭头的一端。
出度:顶点v的出度即是以该顶点为始点的边的数目。
入度:顶点v的入度即是以该顶点为终点的边的数目。
度:无向图中顶点的度就是关联于该顶点的边的数目。
强连通分量:有向图的极大强连通子图称为强连通分量。
强连通图:有向图中,若图中任意两个不同顶点都存在路径,则称该图为强连通图。
连通分量:无向图的极大连通子图称为它的连通分量。
图的遍历:从图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历。
生成树:生成树是连通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之变成非连通图。
生成树的权:生成树各边的权值总和称为生成树的权。
最小生成树:权最小的生成树称为最小生成树。
有向无环图:一个无环的有向图称做有向无环图。
AOV网络:用顶点表示活动,用有向边<Vi,Vj>表示活动Vi必须先于活动Vj进行,即用弧表示活动间的优先关系。这种有向图叫做顶点表示活动的AOV网络。
AOE网:AOE网是一个带权的有向无环图,其中,顶点表示事件,弧表示活动,权表示活动持续的时间。
关键路径:从源点到汇点的最长路径长度叫做关键路径。
关键活动:关键路径上的所有活动都是关键活动。
最短路径:即求两个顶点间长度最短的路径,但不是指路径上边数的总和,而是指路径上各边权值的总和。
存储结构

常见算法时间复杂度
DFS
深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广。
实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用结构。
显然,这是一个递归的过程。为了在遍历过程中便于区分顶点是否已被访问,需附设访问标志数组visited[0:n-1], ,其初值为FALSE ,一旦某个顶点被访问,则其相应的分量置为TRUE。
从图的某一点v 出发,递归地进行深度优先遍历的过程如下:
1 | void DFS(Graph G,int v ) |
邻接表表示时,查找所有顶点的邻接点所需时间为O(E),访问顶点的邻接点所花时间为O(V),此时,总的时间复杂度为O(V+E)。
邻接矩阵表示时,查找每个顶点的邻接点所需时间为O(V),要查找整个矩阵,故总的时间度为O(V^2)。
v为图的顶点数,E为边数。
BFS
遍历顶点的每个相邻边的时间复杂度称为O(N),其中N是相邻边的数量。因此,对于V个顶点,时间复杂度变为O(V*N)=O(E),其中E是图形中边的总数。由于是从Queue中删除顶点或向Queue中添加顶点O(1),因此为什么将顶点添加到BFS的整体时间复杂度中O(V+E)。
图的基本术语
最小生成树算法Prim,Kruskal
Prim算法的时间复杂度为O(n^2)
Kruskal的算法复杂度为O(eloge)



普里姆Prim


克鲁斯卡尔Kruskal


最短路径Dijkstra,Flody

Dijkstra
时间复杂度为:O(n^2)


Flody
拓扑排序AOV网
n个顶点,e条边的有向无环图过不排序时间复杂度为 O(n+e)
- 找到无入度的点
- 任选其中一点加入排序队列
关键路径AOE网

活动余量为0则为关键

查找
时间复杂度
- 顺序查找法的平均查找长度为:(n+1)/2

关于ASL(平均查找长度)的简单总结
B树
对于关键字为n,高度为h,阶数为m的B数,最小高度为:



B+树


二叉排序树BFS


二叉排序树删除节点的几种方法
1:删除节点左子树的最右边的元素替代之,相当于用前继节点替代
2:删除节点右子树的最左边的元素替代之,相当于用后继节点替代
以上两种都不改变中序遍历二叉树所得的顺序
3:设要删除的节点是B,节点B是节点A的左子树。删除节点B以后,令B的左子树为A的左子树,B的右子树加到B的左子树的最右边。

二叉平衡树AVL


散列
二次探测

排序
排序算法
创建二叉排序树的时间复杂度是O(nlog2n)

| 各种常用排序算法 | ||||||||
|---|---|---|---|---|---|---|---|---|
| 类别 | 排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | 特点 | ||
| 最好 | 平均 | 最坏 | 辅助存储 | 简单 | ||||
| 插入排序 | 直接插入 | O(N) | O(N2) | O(N2) | O(1) | 稳定 | 简单 | |
| 希尔排序 | O(N) | O(N1.3) | O(N2) | O(1) | 不稳定 | 复杂 | ||
| 选择排序 | 直接选择 | O(N) | O(N2) | O(N2) | O(1) | 不稳定 | ||
| 堆排序 | O(N*log2N) | O(N*log2N) | O(N*log2N) | O(1) | 不稳定 | 复杂 | ||
| 交换排序 | 冒泡排序 | O(N) | O(N2) | O(N2) | O(1) | 稳定 | 简单 | 1、冒泡排序是一种用时间换空间的排序方法,n小时好2、最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序,最差时间复杂度O(N^2)只是表示其操作次数的数量级3、最好的情况是数据本来就有序,复杂度为O(n) |
| 快速排序 | O(N*log2N) | O(N*log2N) | O(N2) | O(log2n)~O(n) | 不稳定 | 复杂 | 1、n大时好,快速排序比较占用内存,内存随n的增大而增大,但却是效率高不稳定的排序算法。2、划分之后一边是一个,一边是n-1个,这种极端情况的时间复杂度就是O(N^2)3、最好的情况是每次都能均匀的划分序列,O(N*log2N) | |
| 归并排序 | O(N*log2N) | O(N*log2N) | O(N*log2N) | O(n) | 稳定 | 复杂 | 1、n大时好,归并比较占用内存,内存随n的增大而增大,但却是效率高且稳定的排序算法。 | |
| 基数排序 | O(d(r+n)) | O(d(r+n)) | O(d(r+n)) | O(rd+n) | 稳定 | 复杂 | ||
| 注:r代表关键字基数,d代表长度,n代表关键字个数 |


堆排序


当下沉的子节点值想等时,往左边下沉
错题总结
下标运算
循环队列对头尾不熟悉,
数据结构的多种实现
查漏补缺
- 排序算法
- AVL树
- 二叉树和森林转换
- 根据遍历结果还原树
- 多存储结构的实现
- 哈夫曼树权值计算
- 常见算法实现和时间复杂度
- 图的一些概念
- 有序链表倒置算法
- AOE网
- 图遍历
- 概念知识
- 查找算法实现细节
- 折半查找插入
- 树的兄弟链存储遍历
- 前中后缀表达式
- 算法分析
- 十字链表
- 排序算法的实现
- 快速排序、堆排序、归并排序和基数排序实现细节
- 拓扑排序细节
- 简答题
- 算法题
- 链式基数排序
- B树
错题总结
选择题







































判断题







填空题

















)
)











大题


【一棵度为2的树和一棵二叉树有什么区别】
1、度不同
度为2的树要求每个节点最多只能有两棵子树,并且至少有一个节点有两棵子树。二叉树的要求是度不超过2,节点最多有两个叉,可以是1或者0。
在任意一棵二叉树中,叶子结点总是比度为2的结点多一个。
2、分支不同
度为2的树有两个分支,但分支没有左右之分;
一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能随意颠倒。
3、次序不同
度为2的树从形式上看与二叉树很相似,但它的子树是无序的,而二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。




算法题总结



、





