一.基本概念
1.数据
- 数据
- 数据元素: 表中的一行 一个人
- 数据项 (数据的最小单位):姓名 年龄
- 数据对象:若干个数据元素组成的表
- 数据结构
2.逻辑结构与物理结构
(1)逻辑结构
- 集合结构
- 线性结构
- 树结构
- 图结构
(2)物理结构(存储结构)
- 顺序存储
- 链式存储
3.(抽象)数据类型
- 数据类型
- 抽象数据类型 变量+函数(类似于C++的类)
二.算法
1. 算法的时间复杂度与求法
- 时间复杂度:规定时间里的运算次数
- 求法:大O阶
三.线性表
1.顺序存储
2.链式存储
(1)组成:数据域+指针域
- 头指针
- 头结点(可选) :数据域可为空或存放一些表的基本信息
- 第一个结点
(2)静态链表(用数组描述链表,也称游标实现法)
1.根据是否有元素分为非空闲链表和空闲链表(又称备用链表)
2. 数组第一个元素和最后一个元素组特殊处理,不存数据,数组第一个元素(下表为0的元素)的cur存放的备用链表的第一个结点的下标,数组最后一个元素的cur存放着第一个有数值元素的下标。
3. 分为三部分游标 数据 下标
(3)循环链表
- 定义;将最后一个指针由空指针改为指向头结点,使真个链表形成一个环
-加一个头指针或者尾指针
(4)双向链表
- 在单链表的每个结点中在设置一个指向其前驱结点的指针域也就是说每个结点有两个指针域,一个指向其直接前驱,一个指向其直接后驱。
四.栈
- 限定仅在表尾进行插入和删除操作的线性表
- 后进先出
- 栈顶 栈底 入栈 出栈
1.栈的顺序存储
- 两栈共享空间
1.用一个数组表示两个栈,栈1和栈2
2.数组始端是栈1的栈底(bottom1),数组末端是栈2的栈底(bottom2)
3.top1和top2表示栈1和栈2的栈顶指针
4.top1+1=top2表示来那个栈都满,不能继续插入数据
2.栈的链式存储(类比线性表的链式存储)
- 不需要头结点
3.栈的应用
1.递归
2.四则运算:中缀->后缀
五.队列
- 定义:只允许在一端进行插入操作,而在另一端进行删除操作的线性表(允许插入的端是队尾,允许删除的一端是队头)
- 特点:先进先出
- 循环对列
定义:头尾相接 - 队列的链式存储:和线性表的链式存储类似,只不过只允许在队头出队尾入,若队头出一个元素,则对头指针后移一个,原来第二个成新的队头,队尾同理。
六.串(一种特殊的线性表)
- 定义:由0个或多个字符组成的有限序列,记作S=“a1a2a3…an” 字符串序列为串,但两边的双引号不算串值 ,ai可以是字母、数字或其他字符
- 注:空串(啥都没有) 空白串(含有一个或多个空格) 子串和主串
- 朴素模式匹配算法(目的:确定主串S中所含子串(模式串)T地第一次出现的位置)
BF算法(朴素 经典 穷举 第一位对上了就看第二位,若没对上,则接着往下走)
KMP算法(避免回溯,匹配速度快)
七.树
- 定义:树是n个结点的有限集。n=0时称为空树。
在任意一颗非空树中:
(1)有且仅有一个特定的根(Root)的结点;
(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每个集合本身又是一颗树,并且称为根的子树(SubTree) - 相关概念:
名称 | 定义 |
---|---|
根 | 根结点(没有前驱) |
叶子 | 终端结点(没有后继) |
森林 | m棵不相交的树的集合 |
双亲 | 直接前驱 |
孩子 | 直接后继 |
兄弟 | |
堂兄弟 | |
祖先 | |
子孙 | |
结点 | 树的数据元素 |
结点的度 | 结点挂接的子树有几个直接后继就是几度 |
结点的层次 | 从根到该结点的层数 |
终端结点 | 即度为0的结点,即叶子 |
分支结点 | 即度不为0的结点(也称内部结点) |
树的度 | Max{各结点的度} |
树的深度(或高) | Max{各结点的层次} |
- 逻辑结构
- 存储结构:链式存储 孩子兄弟表示法(多叉树 ->二叉树)
八.二叉树
- 定义:根结点有两个互不相交的子树(左子树 右子树)
- 特征:
1.每个结点最多有两颗子树
2.左子树和右子树是有顺序的
3.即使树中某结点只有一颗子树也要区分是左子树还是右子树 - 五种基本形态:
1.空二叉树
2.只有一个根节点
3.根节点只有左树
4.根节点只有右树
5.根节点既有左树又有右树 - 几种特殊的二叉树
1.斜树:左斜树 右斜树
2.满二叉树
3.完全二叉树(满二叉树的特例):虽然前k-1层是满的,但最底层却允许在右边缺少连续若干个结点 - 性质
- 存储结构
1.顺序存储:从上到下 从左到右
2.链式存储:左边放左孩子 右边放右孩子 中间放数据
- 二叉树遍历(对二叉树插入删除修改查找和排序运算的前提)
1.原理:从根节点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次
2.四种方法
(1)前序遍历:根结点->左树->右树
(2)中序遍历:左树->根节点->右树
(3)后序遍历:左树->右树->根节点
(4)层序遍历 1层->2 层->3层…->k层
3.扩展二叉树->一种遍历就可以确定二叉树
九.线索二叉树
- 问题:二叉链表法存储包含n个结点的二叉树,结点的指针区域会有n+1个空指针
- 解决方法:在空指针存直接前驱和后继前驱,这样提高查找速度
约定:
当Tag=0,表示正常情况(孩子指针)
当Tag=1,表示线索情况(线索指针) - 树转换成二叉树
1.将树中所有兄弟结点之间加一条连线(加线)
2.保留结点最左孩子的连线,删除其他孩子的连线(抹线)
3.将同一孩子的连线绕左孩子旋转45度(旋转) - 二叉树转化成树
1.加线2.抹线3.旋转 - 森林转换成二叉树
法1.:
1.每个树各自转为二叉树
2.依次连到前一个二叉树的右树
法2.:
森林直接变为兄弟,再转为二叉树 - 树的遍历
1.深度优先遍历(先根、后根)
2.广度优先遍历(层次) - 森林的遍历(一个一个接着写)
1.深度优先遍历(先根、后根)
2.广度优先遍历(层次)
十.图
- 定义
- 基本术语;
十一.查找
1.静态表查找
1.顺序查找(线性查找):逐一对比
2.折半查找(二分或对分查找);先对数据进行排序 二分法查找
3.分块查找(索引顺序查找):将数据分成一块一块的,在每一块查找
2.动态表查找(若找到关键字key,则返回成功,若未找到关键字,则创建关键字等于key的记录)
(1)二叉排序树
- 定义:一颗空树或者有如下性质的非空二叉树
1.左子树的所有结点值均小于根的结点
1.右子树的所有结点值均大于根的结点
1.它的左右子树也分别为二叉排序树 - 操作:查找 替换 删除
(2)二叉平衡树(树的结构均匀,则查找效率高)(AVL树)
- 定义:
(1)是一棵空树或满足下面性质的二叉树
(2)左子树和右子树深度之差的绝对值不大于1
(3)左子树和右子树也是平衡二叉树 - 平衡因子
左子树和右子树深度之差的绝对值(只可能是0、-1、1)
以下讨论的是二叉排序平衡树
构造平衡二叉树:平衡化旋转
三个元素,除根节点,其余两个元素的位置,都在右边是RR型
1.LL型
2.RR型
3.LR型
4.RL型
总结:先整成一条线,大的放左边,小的放右边
- 操作:插入
3.多路查找树
- 定义:为了降低平衡二叉树的高度,提高效率我们使树中的每个结点的孩子数多于两个,每个结点处可以存储多个元素,并且元素之间存在某种特定的 排序关系
- 2-3树(两个或三个孩子)
一个2节点包含一个元素和两个孩子(或没有孩子)
一个3节点包含两个元素和三个孩子(或没有孩子)
操作:插入 (是否满足关于规范,比大小放到父结点中间)
删除 - 2-3-4树
一个2节点包含一个元素和两个孩子(或没有孩子)
一个3节点包含两个元素和三个孩子(或没有孩子)
一个4节点包含三个元素和四个孩子(或没有孩子) - B树 是一种多路查找树,最大的孩子数目称为B树的阶,2-3和2-3-4都是B树
4.哈希查找表(散列存储结构)
散列存储结构基本思想:建立关键码与存储位置对应关系,或者说由关键码的值决定数据的存储的地址
eg:学号180602403 存成V[03]
- 基本概念
名称 | 定义 |
---|---|
哈希方法 | 依函数(转换函数)传入关键字计算元素的存储位置 |
哈希函数 | 哈希方法里使用的哈希函数 |
哈希表 | 按上述思想构造的表 |
同义词 | 具有相同函数值的两个不同关键字 |
冲突 | 不同关键字映射到同一哈希地址,这种现象叫做冲突 |
- 哈希函数的构造方法(用空间换时间)
1.直接定址法 2.除留余数法 3.数字分析法 4.平房取中方5.折叠法6.随机数法 - 冲突处理方法:
1.开放的定址法
线性物探测法(核心思想:如果位置被占了,就往后顺)
2.链地址法(拉链法)
基本思想:具有相同暗哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用数组将m个单链表的表头指针存储,形成动态结构
3.再哈希法:发生冲突就换哈希函数
4.溢出表:把冲突的元素放到另一个表中
十二.排序
- 定义:一定规律排列
- 目的:便于查找
- 分类:
1.插入排序
1.直接插入排序
2.希尔排序
2.交换排序
1.冒泡排序:两两比较,并按“前小后大”(或“前大后小”)交换
2.快速排序:从待排序列中任取一个元素(例如取第一个)作为中心,所有比它小的元素一律前放,所有比它的元素一律后放,形成左右两个字表。然后再对各子表重新选择中心元素,接着调整,直到只剩下一个,此时就是有序序列
3.选择排序
每一趟在后面的n-i个待排记录中选择关键字最小的记录作为有序序列中的第i个记录(人话:先找到最小的放到第一个,再在剩余里面找到最小的放到第二个,以此类推)
(1)简单选择排序
(2)堆排序
1.什么是堆
堆是一棵顺序存储的完全二叉树
结点的关键字小于等于孩子结点->小根堆
结点的关键字大于等于孩子结点->大根堆
2.怎么建立堆
3.怎么建立堆排序
4.归并排序
- 基本思想:将两个(或以上)的有序表组成新的有序表