1.四类基本数据结构
集合、线性结构、树形结构、图状结构
2. 两种存储结构
顺序存储:
- 逻辑上相邻物理也要相邻
- 插入删除要动元素
- 可以随机存储
链式存储:
- 指针域+数据域
- 物理上可以不相邻
- 插入删除不用移动元素
- 链表分为线性链表、循环链表、双向链表
3. 栈与队列
栈:后进先出,LIFO 栈顶是top指针,进出都在栈顶
队列:先进先出,FIFO 队尾插,队头删
4.二叉树
- 性质1. 第i层最多2^(i-1) 个结点
- 性质2. 深度k最多2^k - 1个结点
- 性质3. 最后一层结点数=度为2的结点数+1
- 先序遍历:根-左-右
- 中序遍历:左-中-右
- 后序遍历:左-右-中
- 赫夫曼编码:从权值最小的开始当孩子,建树、01编码
5. 图 - 连通图的生成树是极小连通子图,在生成树上加一条边,一定成环
- 入度和=出度和
- 邻接矩阵、邻接表
- DFS、BFS
- 最小生成树:prim算法、Kruskal算法
- prim:每次选到已连通所有点中最小的点去连通
- 克鲁斯卡尔算法:每次都找最小代价的边
- 拓扑排序,从偏序得出全序
- 偏序是自反的、反对称的、传递的。
- 每个x,y都存在偏序关系,就是全序
- 拓扑排序可以用于流程图
- 单源点最短路径:Dijkstra迪杰斯特拉算法:每次都找离源点最近的点
- 每对顶点间的最短路径:弗洛伊德算法:插点法,判断两点间距离小还是插入一个点距离小
6. 查找
折半查找:查找过程类比于树
索引顺序查找:又称分块查找,弄成分块有序的,索引表放每块里的最大值。找块可以用折半或顺序、块中无序只能顺序。
二叉排序树:左子树小于根结点、右子树大于根结点
平衡二叉树:对二叉排序树进行调整,左右子树深度差不超过1
B树、B+树、B-树
7. 排序
冒泡排序:两两交换,每轮会把最大的放到最后面
选择排序:每次选剩余中最小的放到还未排的序列的最前面
快速排序:把一个数组分成两个,找一个值,小于它放这个数前,大于他放这个数后。递归实现
归并排序:把数组分成两个子数组进行分别排序,也是递归的感觉,先分解再排序
堆排序:大顶堆或者小顶堆,从叶子结点开始往上换,从根结点出来。
插入排序:每个数都找自己的位置插进去。
希尔排序:基于插入排序的快速排序算法。根据步长把数组分组,然后每个组内进行插入排序
基数排序:将数切割,进行每一位的比较,可以是最低位优先法,也可以是最高位优先法。
排序算法 最好时间复杂度 最坏时间复杂度 空间复杂度 内部or外部排序
冒泡排序 O(n) O(n^2) O(1) 内部排序
选择排序 O(n^2) O(n^2) O(1) 内部排序
插入排序 O(n) O(n^2) O(1) 内部排序
基数排序 O(nk) O(nk) O(n+k) 外部排序
希尔排序 O(nlogn) O(1) 内部排序 不稳定
归并排序 O(nlogn) O(nlogn) O(1) 内部排序
快速排序 O(nlogn) O(n^2) O(1) 内部排序 不稳定
堆排序 O(nlogn) O(nlogn) O(1) 内部排序 不稳定