数据结构:数据之间的逻辑结构,数据的存储结构,数据的算法。
数据的逻辑结构:
- 集合(无逻辑关系)
- 线性结构(线性表):一维数组,队列,栈
- 非线性结构:树,图,多维数组
数据的存储结构
- 顺序存储结构
线性表:顺序表和链式表
- 链式存储结构
- 索引存储结构
- 散列存储结构
按存储结构划分
- 线性表
- 顺序表(顺序存储)
- 链表(链式存储)
- 单链表
- 循环链表
- 双链表
- 栈:先进后出
- 队列:先进先出
- 循环队列
- 当队尾指针+1=队首指针的时候,队满
- 当队首指针和队尾指针相等的时候,队空
- 循环队列
- 树和二叉树
- 定义
- 结点的度:当前结点有几个子结点,它的度就是几
- 树的度:当前树中最大的结点的度,就是树的度 3
- 叶子结点:没有子结点的结点称为叶子结点。3,5,6,7,9,10
- 分支结点:除叶子结点之外的节点,其余都是分支结点,有分支的结点,都是分支结点。叶子结点和分支结点是互补的。
- 父结点,子结点,兄弟结点,三者是相对的量
- 层次:从高到低层次依次为0依次增长。
- 树的遍历
- 前序遍历:父结点,从左向右访问子结点,只要有子结点,就从左向右访问子结点,然后从左向右访问兄弟结点
- 后序遍历:从左向右访问叶子结点,只要有叶子结点,就不访问,父结点,然后访问兄弟结点
- 层次遍历:从高层向底层从左向右访问
- 二叉树
- 满二叉树:除去最后一层的叶子结点,其余都有两个叶子结点。
- 完全二叉树:除去最后一层的叶子结点,则为完全二叉树,从0或1开始按层次遍历二叉树,数值是连续的,从左至右是连续排列的。
- 定义
- 图
- 图与树的对比
- 树:父结点能与下边的很多结点相连,但是下一层的结点只能与上一层的一个结点相连
- 图:图的下一层结点能与上一层的许多结点相连
- 图G的构成表示 G=(V,E),
- 有向图,线带箭头;无向图,线不带箭头
- 顶点集合V(G)
- 边集合E(G)
- 有向图中<1,2>和<2,1>是不同的,无向图中(1,2)和(2,1)是相同的
- 有向图,线带箭头;无向图,线不带箭头
- 顶点的度
- 无向图中:与此顶点相连的线的条数
- 有向图中:
- 入度:指向此顶点的箭头的数目
- 出度:此顶点发出的带箭头的线的数目
- 完全图
- 无向图:每对顶点之间都有一条边相连
- 有向图:每对顶点之间的两个顶点,都有另一个顶点的入度线和出度线对应
- 路径
- 回路:起点和终点是一个点
- 简单回路:除了起点和终点之外,中间再没有相同的点,整个路径上除了起点和终点之外,没有重复点。
- 回路:起点和终点是一个点
- 连通图和连通分量
- 图的存储
- 邻接矩阵
- 无向图的邻接矩阵是中心对称的
- 有向图中的邻街矩阵是非对称的
- 图的邻接链表
- 邻接矩阵
- 图的遍历
- 从图中的某一个顶点出发,访问图中的每一个结点,只能访问一次,称为图的遍历
- 深度优先:每遍历一个节点,都必须先遍历完与此节点相邻的其它结点,然后再遍历与之同层次的结点。
- 广度优先:遍历一点之后,然后依次遍历与此点相邻的结点,遍历完成之后,再依次遍历相邻结点的子节点,遍历完一个节点
- 图的最小生成树
- 普里姆算法:将图中的点划分为两个集合,最初划分出去的集合A由一个点组成,然后选取另一个集合B中与A集合中唯一点最近的的点,将其从集合B划分到集合A中,接着选取B中的与A中点最近的一个。将此点划分到A中,以此类推。
- 克鲁斯卡尔算法:依次选取最小的边,直到所有的顶点都连接到了一起(任意两点都能通过一个点或两个点间接相连)使图产生环路的边,绝对不能取
- 图与树的对比
选取n-1边为止,选取n条边必定有回路,就形不成最小生成树了
- 关键路径:顶点为事件,线上为活动,
- 顶点j事件的最早发生时间:因为在有向图中,需要将所有入度指向事件j的事件都执行完。才能执行到事件j,不然的话,是没有执行条件的。
- 活动ai的最早开始时间:出度的点事件的最早发生时间,就是出度线最早的开始时间。
- 顶点的事件最早发生时间也就是出度活动的最早发生时间
- 定点j事件的最迟发生时间就是出度活动的最晚发生时间
- 活动ai最迟的发生时间,入度点事件的最迟发生时间-活动所需要的时间
- 顶点事件j的最迟发生时间,终点事件最早发生的时间max,中间如有那条路径到达终点事件x小于max,则这条路径上的事件最迟发生时间小于顶点事件的最早发生时间,最迟发生时间一般为,入度事件的最迟发生事件 减去 活动的时长。
- 排序算法
- 插入排序
- 直接插入排序:以第一个数值为有序序列,然后将后边的数据按从小到大的序列插入其中
- 希尔排序:
- 选择排序:不断选择最小的或最大的放到最前边,然后在剩余数组中继续选择最小的或最大的。
- 堆:顶点的值小于叶子结点的值(小顶堆),或者顶点的值大于叶子结点的值(大顶堆)
- 数组堆排序的建立
- 完全二叉树
- 调整n/2号结点
- 调整n/2-1号结点
- 调整父结点,调整完父结点之后,可能会影响子树的的堆排序,这时,就需要从新调整子树的堆排序。
- 使得父结点的值变为最大
- 父结点和最后一个子节点对调,将父结点排除出去,即得到最大值。
- 如此类推
- 数组堆排序的建立
- 交换排序
- 冒泡排序:相邻两个元素进行比较,若不满足排序规则,则进行交换,每次都能求出最小的或者最大的一个数值。
- 快速排序
- 方法一:
- 以第一个数为Key,指向key的指针为指针key,与最后一个进行比较如果不满足排序规则,则进行交换,交换后,指向指向key的指针不便,指向另一个数的指针前移或后移一位,继续与key,进行比较,如果不满足交换规则,则进行交换,直到与57相邻的数值也进行了比较,并排序
- key值左右两边的数组,继续进行二分排序
- 方法二:
- 两个指针,一个指针从前往后移动,寻找比key大的值,另一个指针从后向前移动,寻找比key小的值,两个指针一旦同时找到符合条件的数值,则进行交换
- 方法一:
- 归并排序
- 就是分组,进行排序,然后将小组排序后形成大组,直到最后所有的数值都到了最大的数组中。
- 基数排序:在收集十位的时候,在确保十位是按从小到大排列的同时,在收集个位的时候,已经确保了个位是从小到大排列的,在收集百位的时候,确保了百位是按从小到大排列的。所以最终三者都是按从小到大排列的。满足条件。
- 插入排序
- Hash表:又可称为哈希表,散列表,或是杂凑表。是一种十分实用的查找技术,具有极高的查找效率。根据内容得到存储地址,用到哈希函数来存储。
- Hash函数的构造方法:哈希函数为一组关键字产生的冲突越少,哈希函数越好。没有特定的要求
- 直接定址法:以键值对的方法定位,键值是不重复的,所以可以采用直接定址法。最理想的状态。选择条件:键值对选择直接定址法。
- 除余法:
- 基数转换法:将关键码看作是某个基数上的整数,然后将其转换成为另一基数制上的数。
- Hash函数的构造方法:哈希函数为一组关键字产生的冲突越少,哈希函数越好。没有特定的要求
- 查找算法
- 顺序查找
- 二分查找:要求的待查找序列为有序表。多次寻找查找序列的中间值
- 分块查找:将查找表分为多块,前面的块和后面的块有大小顺序,然后将每一块的最大关键字和每一块的起始存储位置取出,存放在索引表中。