1. 算法概述
- 算法是解决某一特定问题的有步骤的方法,特性包括有穷性、确定性、可行性、输入、输出;
- 算法时间复杂度表示代价增长率的上界,用大O表示法
2. 线性表
- 线性表,当 n > 0时,前面的数字是后面的直接前驱,后面的数字是前面的直接后继,运算包括插入、查找、删除、排序、求表长、合并和分拆;
- 顺序表,用一组地址连续的存储单元依次存放数据元素,逻辑上相邻的数据元素其物理存储位置必须紧邻;
- 顺序表节省存储空间,便于随机访问表中任一元素,但插入和删除运算不便,对于长度可变的线性表,预先估算所需的空间比较困难;
- 线性表链表,用一组任意的存储单元存放线性表的数据元素,逻辑上相邻的数据元素其物理存储位置不要求紧邻;
- 单链表,逻辑顺序在存储位置,数据放到数据域,每个数据的标记下一个数据的存储位置的指针在指针域,也就是后继;
- 栈是限定在表的一端插入或删除的线性表,允许插入或删除的一端为栈顶;不允许插入或删除的一端为栈底;最后进栈的元素最先出栈,所以栈又称为后进先出表;
- 队列是在表的一端允许插入,在另外一端允许删除的线性表;允许删除的一端为队首,允许插入的一端为队尾;运算包括进队、出队和取队首元素等;队列又称为先进先出表;队列有循环队列和链队;
- 循环链表是最后一个结点的指针指向头结点;双向链表(双链表)是链表的一种。和单链表一样,双链表也是由结点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
3. 数组和广义表
- 数组是由同类型的数据元素构造而成,它的每个数据元素都对应一组下标
- 一维数组可看成是一个线性表,可以把一维数组的下标理解为线性表的序号;二维数组也可以看成是一个线性表,其中每个元素是一个一维数组;
- 数组的主要运算是给定一组下标,存取或修改相应的数组元素;
- 矩阵分为特殊矩阵、对称矩阵(只存放 下三角元素)、稀疏矩阵
- 设矩阵
中有 t 个非零元素,若 t 远远小于矩阵元素的总数 m*n,则次矩阵为稀疏矩阵;
- 设矩阵
- 广义表是
个元素的有限序列,记为
,其中di可以是原子元素和子表,但是表尾一定是一个子表;
- 广义表的表长:表中元素的个数
- 广义表的深度:表非空时,表展开后所含括号的层数
- 广义表取表头函数为head(L)
- 广义表取表尾函数为tail(L)
4. 树
个结点的有限集合T,在一棵非空树中有且仅有一个特定的结点称为树的根;当
时,其余结点分为
个互不相交的集合
。每个集合又是一棵树,称为根的子树。
- 结点的度:结点的子树个数,比如结点A有B、C和D三个结点度
- 树的度:结点度的最大值,比如A的结点度是3,B的结点度是2.....,比较后最大值是3,则树的度为3
- 叶子结点:度为0的结点,比如E、F、G、H、I、J都是叶子结点
- 分支结点:度不为0的结点,比如A、B、C、D都是分支结点
- 结点A是结点B、C和D的双亲;结点B是结点E和F的双亲;结点C是结点G的双亲;结点D是结点H、I和J的双亲;
- 结点B、C和D是结点A的孩子;结点E和F是结点B的孩子;结点G是结点C的孩子;结点H、I和J是结点D的孩子;
- B、C和D三者都互为兄弟结点;E、F、G、H、I、J都互为兄弟结点;
- 其他节点都是A节点的子孙节点;
- 结点的层次:根在一层,孩子结点的层次等于双亲结点的层次加1
- 树的高度:树中结点所在的最大层次,这里为3;
- 森林:
棵互不相交的树的集合
4.1 二叉树
- 二叉树是
个结点的有限集合,它或为空树 (n=0),或由一个根结点和两棵分别成为根的左子树和右子树的互不相交的二叉树组成
- 二叉树的第 i 层上至多有
个结点(
)
- 高度为k的二叉树至多有
个结点(
)
- 任意一棵二叉树中,若其叶子结点数为
,度为2的结点数为
,则
- 遍历二叉树是指按一定的规律走遍该结构的所有结点,并对每一个结点都访问且仅访问一次;分为先序、中序和后序遍历;
- 二叉树的第 i 层上至多有
4.2 哈夫曼树
- 分支:树中结点之间的连线
- 两结点间的路径长度:两个结点之间分支个数
- 树的路径长度:根结点到每个结点的路径长度之和(PL)
- 树的带权路径长度:叶子结点的权值与其到根结点路径长度积的和
- 哈夫曼树就是带权路径长度最小的树
5. 图
- 图由V(G)和E(G)组成,记为
,其中V(G)是顶点的非空有穷集合,E(G)是边的有穷集合;
- 边:相关的顶点的偶对
- 有向图:图中的边是有向边(弧),有向边是顶点的有序对。如
- 无向图:图中的边是无向边,无向边是顶点的无序对。如
- 若两个顶点之间有边,则这两个顶点是相邻的,称边与这两个顶点相关联
- 有向完全图:具有n个顶点的有向图中,有
条边
- 无向完全图:具有n个顶点的无向图中,有
条边
- 顶点的度:关联于顶点v的边数,记为
- 顶点的出度:有向图中,顶点v的出边数,记为
- 顶点的入度:有向图中,顶点v的入边数,记为
- 子图:若图G1中的顶点和边都包含在图G中,则称图G1是图G的子图
6. 串
- 串是
个字符的有限序列,记作
,其中S的串名,等号右边的是串值,每一个元素是字符,n是串的长度
- 空串:长度为0的串
- 空白串:仅由一个或多个空格字符组成的串
- 子串:串中任意个连续字符组成的子序列
- 子串在主串中的位置:作为子串整体,其第一个字符在主串中第一次出现的序号
7. 集合
- 集合是元素的一个群集,其中的元素可以是原子(单元素),也可以是集合
8. 查找
- 线性表查找
- 顺序查找
- 二分查找:在顺序存储的有序表中,先用给定值 k 与表中间位置的关键字比较,若相等,则查找成功,否则根据比较结果判定继续是在前半部分,还是在后半部分子表中查找,如此重复,直到成功找到或确定无此数据。当表较大时,二分查找的平均查找长度比顺序查找小,但它要求线性表是用顺序存储结构且按关键字从小到大排列
- 分块查找:又称为索引顺序查找。先把线性表分成若干块,块内关键字无序,块间关键字有序,另需建立一个索引表,索引项的关键字域存放相应块的最高关键字,链域存放对应块第一个结点的存储位置。分块查找会先用顺序或二分查找索引表确定待查结点所在的块,然后在已限定的那个块中顺序查找;