数组
1. 稀疏数组
由二维数组转稀疏数组(数组压缩与解压)
稀疏数组模型,适用数组中大部分是都是重复元素
模型
row行数 | 列数量| value值
链表
单链表
- 单链表反转
- 遍历单链表,新建新节点,将依次将单链表的值插入到新节点的头位置
- 将原链表的头指向新链表的头节点的 .next节点
- 单链表逆序打印
- 方式1 使用单链表反转打印(不推荐,破坏原链表结构)
- 方式2 将节点压入栈中,利用栈的先进后出特点,实现逆序打印
双向链表
单向循环链表(有头节点 和 没有头节点)
- 约瑟夫(环)问题:编号1~n形成一个环形,约定编号K从1开始报数,数到m的那个人出列,他的下一位又开始从1报数,到m出列,重复。求最后出列的顺序
栈与队列
-
栈
- 应用场景
- 使用栈实现计算器的计算
- 前缀、中缀、后缀表达式(逆波兰表达式)计算机计算方式
- 应用场景
-
队列
先进先出 -
递归
- 使用场景:
- 各种数学问题:8皇后问题,汉诺塔,阶乘,迷宫,球和篮子等问题
- 各种算法中:快排,归并排序,二分查找,分治算法等
- 将用栈解决的问题-使用递归解决比较简洁。
- 使用规则,注意事项
-
- 迷宫游戏(思考,最短路径问题)
- 迷宫游戏(思考,最短路径问题)
-
- 八皇后问题
介绍:8*8的棋盘上摆放8个皇后,任意两个皇后不能在同一行,同一列,同一斜线上,问有多少种摆法。
递归算法分析,这里是基础算法,后可以使用贪心算法优化
- 八皇后问题
- 使用场景:
排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序(插入排序,缩小增量排序)
- 快速排序(冒泡排序)
- 归并排序
- 基数排序(桶排序)
- 堆排序(二叉树的实际应用部分介绍)
查找算法
-
线性查找
-
二分查找
-
插值查找(优化二分查找)
-
斐波那契查找(黄金分割查找0.618)
有时候需要对数组扩容
哈希表
二叉树
- 二叉树的遍历(可以根据跟节点的输出顺序进行区分)
- 前序遍历
- 中序遍历
- 后序遍历
- 二叉树的查找节点
- 前、中、后三种遍历查找
- 二叉树遍历删除节点
- 顺序二叉树(基本考虑完全按二叉树)
- 二叉树可以与数组进行互相转化
- 顺序二叉树与数组的转化关系如下:
- 线索化二叉树
-
普通二叉树中,叶子节点和缺少分支的节点,存在指针浪费的问题(浪费指针的个数 n+1,其中n 代表当前树节点的个数),为了有效利用指针,可以将浪费的指针指向后继节点(根据二叉树的前、中、后序遍历确认后继节点)
-
线索二叉树规则:
-
线索化二叉树的遍历,不可以使用普通之前的二叉树遍历方式,因为线索二叉树将原空指针连接到了后继节点,不会出现空的现象,所以可以不用递归遍历,可以通过循环遍历线索二叉树即可。
-
二叉树的实际应用
- 堆排序(选择排序 nlogn,不稳定排序)
-
大顶推(完全二叉树)
每个节点的值都大于左右孩子的值,成为大顶堆。如下:
-
小顶堆 与大顶堆相反。大顶堆通常用于生序,小顶堆用于将序
-
堆排序基本思想:
-
- 赫夫曼树(最优二叉树)
- 赫夫曼树基本介绍:
- 赫夫曼树举例说明如下:
- 符合创建赫夫曼树:
- 二叉排序树
- 二叉平衡树
- 2 _3树
- b树