文章目录
- 汇编、编译与解释
- 正规式
- 程序设计语言的基本概念
- 程序设计语言
- 常量和变量
- 函数
- 面向对象
- 基本概念
- 面向对象三特性
- 多态类型
- 数据结构基础知识
- 顺序存储
- 链式存储
- 栈
- 串
- 树
- 基础概念
- 二叉树
- 满二叉树
- 完全二叉树
- 大顶堆与小顶堆
- 二叉排序树
- 最优二叉树/哈夫曼树/霍夫曼树
- 遍历
- 后缀表达式/逆波兰式
- 图
- 图的概念
- 有向图
- 无向图
- 完全图
- 度,出度,入度
- 有向树
- 邻接矩阵表示法
- 算法
- 概述
- 特性
- 复杂度
- 常用描述
- 查找算法
- 排序算法
汇编、编译与解释
| 汇编 | 编译 | 解释 | |
|---|---|---|---|
| 典型代表 | ARM汇编 | C、C++、Java | Python、Javascript |
| 是否需要翻译 | √ | √ | X |
| 是否生成机器码文件 | √ | √ | X |
| 执行过程 | 运行机器码 | 运行机器码 | 解释器逐行分析执行 |
| 速度 | 极快 | 块 | 较慢 |
| 代码修改后 | 重新汇编 | 重新编译 | 可直接运行 |
| 应用场景 | 内核、驱动、嵌入式 | 软件、高性能服务 | 脚本、Web、自动化 |
效率:编译方式比解释方式可能取得更高的效率。
灵活性:解释方式比编译方式更灵活
可移植性:解释方式可移植性更好
正规式
正则
| 正规式 | 正规集 |
|---|---|
| ab | 符号串ab的集合 |
| a|b | 符号串a、b构成的集合 |
| a* | 由0个或多个a构成的符号串集合 |
| (a|b)* | 所有由字符a和b构成的符号串集合 |
| a(a|b)* | 以a为首的字符的a、b字符串的集合 |
| (a|b)*abb | 以abb结尾的a、b字符串的集合 |
程序设计语言的基本概念
程序设计语言
- 语法:单词拼写
- 语义:作用域/类型/变量
- 语用:想干什么
常量和变量
左值指存储单元(地址),右值是值(内容)
变量具有左值和右值,程序运行过程中右值可变
常量只有右值,程序运行过程中右值不可改变
函数
- 传值调用(传基本值)
- 引用调用(传对象地址)
面向对象
基本概念
- 对象
- 消息(对象间的通信)
- 类
- 绑定
面向对象三特性
- 封装
- 继承
- 多态
多态类型
- 参数多态(List<E>、T,泛型)
- 包含多态(父类引用调用子类重写的方法)
- 过载多态(参数不同调的方法不同)
- 强制多态(强制转换)
| 类型 | 关键词 | 绑定时机 | 是否与继承有关 | 典型代码特征 |
|---|---|---|---|---|
| 参数多态 | 泛型、模板、类型参数 | 编译时 | 否 | List<E>、T |
| 包含多态 | 虚函数、覆盖、父类引用 | 运行时 | 是 | animal.eat() |
| 过载多态 | 同名不同参、重载 | 编译时 | 否 | f(int) f(double) |
| 强制多态 | 类型转换、隐式/显式 | 编译时 | 否 | (int)3.14 |
参数是泛型,包含靠继承;
过载看签名,强制靠转型。
运行时单包,编译参过强
数据结构基础知识
- 线性结构:线性表、栈、队列、串
- 非线性结构:图、树
- 链表不能随机访问
顺序存储
链式存储
栈
表达式求值,括号匹配等
10+2*(20-5)的后缀表达式为:10 2 20 5 - * +
计算过程:
- 依次将10,2,20,5 压入栈中
- 遇到“-”,取出5,20,计算20-5,得15,将其压入栈中
- 遇到“”,取出15,2,计算215,得30,将其压入栈中
- 遇到“+”,取出30,10,计算10+30,得40,将其压入栈中
- 表达式结束,计算过程完成
串
即字符串
子串个数的计算公式为:字符串字符个数-子串字符个数+1,即Num = S-s+1
树
基础概念
- 双亲、孩子和兄弟
- 节点的度(一个节点的子树的个数记为该节点的度)
- 叶子节点(也称终端节点,指度为零的节点)
- 内部节点(至少有一个子节点的节点,至少有一个叶子的根节点也算内部节点)
- 节点的层次(根为第一层,根的孩子为第二层,以此类推)
- 树的高度/深度(最大层次)
- 有序树和无序树
- 森林(m≥0,m棵互不相交的树的集合)0棵树和1棵树都是森林
二叉树
- 二叉树中节点的子树要分左子树和右子树,即使在节点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树
- 二叉树中节点的最大度为2,而树中不限制节点的度数
- 二叉树的第i层(i≥1)上 最多有2i-1个节点
- 高度为k的二叉树最多有2k-1个节点(k≥1)
- 对于任何一棵二叉树,若其终端节点(叶子)数为n0,度为2的节点数为n2则n0=n2+1
满二叉树
每个节点都有两个子节点
完全二叉树
自上而下,从左到右的节点配置
大顶堆与小顶堆
每个左中右结构中都是之间的值最大或最小,最大则为大顶堆,最小则小顶堆
二叉排序树
数值按左中右进行排序
对二叉排序树进行 中序遍历(左 → 根 → 右)得到的结果是 升序序列。
最优二叉树/哈夫曼树/霍夫曼树
每个节点的权重随层级而增加,即权重最大的是根节点,最小的是叶子节点
把所有叶子节点按权值放入最小堆(或排序列表)。
重复以下直到只剩一个节点:
- 取出权值最小的两个节点。
- 创建一个新节点,权值为两者之和。
- 新节点的左右孩子分别为这两个节点。
- 将新节点放回集合。
- 最后剩下的节点就是根,整棵树就是最优二叉树。
遍历
分为先序遍历,中序遍历,后序遍历,即对于根节点和其两个左右子节点来说,进行左中右的依次排序,然后
- 将中间节点移到最先就是先序遍历(中左右)
- 将中间节点移到中间就是中序遍历(左中右)
- 将中间节点移到右边就是后序遍历(左右中)
- 先序遍历是:1,2,4,5,3,6
- 中序遍历是:4,2,5,1,6,3
- 后序遍历是:4,5,2,6,3,1
后缀表达式/逆波兰式
后序遍历的产物
对于a+b-c*d
- 先取出字母abcd
- 按计算顺序,先计算的放后面,字母摆在一起,符号放后面
分为三个部分:cd*,ab+,-
3 ab+cd*-
图
图的概念
有向图
每条边都有方向
无向图
每条边都是无方向的
完全图
每个顶点都能互相连通,n个顶点的无向完全图共有n(n-1)/2条边
度,出度,入度
进入该顶点的有向边即为入度,离开该顶点的有向边即为出度,入度出度之和即为度
有向树
有向图恰好有一个顶点的入度为0,其余顶点的入度均为1
就是顶点没有别的节点指向它,是入度为0,别的节点均只有一个父节点,即入度均为1
邻接矩阵表示法
- 每个顶点设置好序号
- 利用二维数组表示边的关系
例如:
A[0][0]表示节点0到节点0的边(指向自己)
A[0][1]表示节点0到节点1的边
A[1][0]表示节点1到节点0的边
- 有该边即为1,无该边记为0,有向的需要注意方向,无向的A[k][n]=A[n][k]
算法
概述
特性
- 有穷性(一个算法必须有穷步骤以及有穷时间内完成)
- 确定性(算法的每一步都是确切定义的)
- 可行性(算法是可行的)
- 输入和输出(算法可以没有输入,但是有至少一个输出,输出与输入有关)
复杂度
- 时间复杂度(执行语句的次数)
- 空间复杂度(占用的存储空间大小)
常用描述
- 流程图
- NS盒图
- 伪代码
- 决策表
- 决策树
查找算法
- 顺序查找(从一端开始,逐个查找)
- 二分查找/折半查找(对于有顺序的元素,查寻中间值与给定值,向偏差方向移动,查找偏差方向的中间值)
- 哈希查找(使用哈希表,相同值存在同一个哈希表内位置)
排序算法
| 类别 | 排序方法 | 稳定性 | 平均时间复杂度 | 空间复杂度 |
|---|---|---|---|---|
| 插入排序 | 直接插入 | 稳定 | O(n²) | O(1) |
| Shell排序 | 不稳定 | O(n(1.3次方) ) | O(1) | |
| 选择排序 | 直接选择 | 不稳定 | O(n²) | O(1) |
| 堆排序 | 不稳定 | O(nlog₂n ) | O(1) | |
| 交换排序 | 冒泡排序 | 稳定 | O(n²) | O(1) |
| 快速排序 | 不稳定 | O(nlog₂n ) | O(log₂n ) | |
| 归并排序 | 稳定 | O(nlog₂n ) | O(n) | |
| 基数排序 | 稳定 | O(d(r+n) ) | O(r+n) | |
- 平均时间O(n²):直接冒泡
- 平均时间O(nlog₂n ):堆快归并
- 稳定:基数归并,冒泡插入