一、线性结构
1.线性结构:每个元素最多只有一个出度和一个入度
2.线性表:顺序表和链表
3.存储结构:顺序储存,用一组地址连续的存储单元一次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻;链式存储,存储各数据元素额结点地址并不要求是连续的,数据元素逻辑上相邻,物理上分开
4.顺序存储和链式存储对比
二、单链表
1.单链表的插入和删除
在上图中P所指向的节点后插入s所指向的节点,操作为:
s->next=p->next;
p->next=s
同理,在单链表中删除p所指向节点的后继节点q时,操作为:
p->next=p->next;
free(p);
三、栈和队列
1.队列、栈是线性结构
2.队列是先进先出,分队头和队尾,栈是先进后出,只有栈顶能进出
四、数组
1.数组是定长线性表在维度上的扩展,m行n列数组表示如下
行向量形式或者列向量形式线性表,单个关系最多只有一个前驱和一个后继,本质哈市线性
2.数组结构的特点:数据元素数目固定,元素类型相同,元素的下标关系具有上下界的约束且下标有序
3.数组数据元素固定,一般不做插入和删除运算,适合采用顺序结构
4.二维数组,假设每个元素占用储存长度为len,起始地址为a,存储地址计算如下:
五、矩阵
1.特殊矩阵:矩阵中的元素分布有一定的规律,对称矩阵、三角矩阵、对角矩阵
2.稀疏矩阵:在一个矩阵中,若非零元素个数远少于零元素个数,且非零元素的分布没有规律
3.存储方式为三元结构,存储每个非零元素的行、列、值
六、广义表
1.广义表:是线性表的推广,是由0个或多个单元素或字表的有限序列
2.广义表与线性表的区别:线性表的元素都是结构上不可分的单元素,而广义表的元素既可以是单元素,又可以是有结构的表
3.广义表记为:LS=(a1,a2,...,an)
七、树
1.树是一种非线性结构,数中的每一个数据元素可以有两个或两个以上的直接后继元素,用来描述层次结构关系
2.树是n个结点的有限集合,n>=0,当n=0时称为空树,在任一颗非空树中,有且仅有一个根节点,其余结点可以分为m个互不相交的有限子集
3.基本概念
七、二叉树
1.二叉树是n个结点的有限集合,一个根节点及两颗互不相交的且分别称为左、右子树的二叉树所组成,与树的区别在于每个根节点最多只有两个孩子节点
2.二叉树特性
3.满二叉树:每层都是满结点的
4.完全二叉树:k-1层是满结点的,第k层结点从左到右是满的
八、二叉树的存储结构
1.顺序存储结构:从上到下,从左到右的顺序依次存储每个节点
2.二叉树的链式存储结构:二叉链表中除了该节点本身的数据外,还存储有左孩子节点的指针、右孩子节点的指针,即一个数据+两个指针
九、二叉树的遍历
1.先序遍历:根左右
2.后序遍历:左右根
3.中根遍历:左根右
4.层次遍历:按层次,从上到下,从左到右
示例:
二叉树形态:
十、线索二叉树
1.若n个节点的二叉树使用二叉链表存储,则必然有n+1个空指针域,利用这些空指针域来存放节点的前驱和后继节点信息,需要增加两个标志,以区分指针域存放的到底是孩子节点还是遍历节点,其中指向前驱、后继节点的指针称为线索,加上线索的二叉树称为线索二叉树
十一、最优二叉树
1.最优二叉树又称为哈夫曼树,是一类带权路径长度最短的树
2.路径:树中一个节点到另一个结点之间的通路
3.树的路径长度:根节点到达每一个叶子节点之间的路径长度之和
4.权:节点代表的值
5.节点的路径长度:路径商的分支数目
6.结点的带权路径长度:该结点到根节点之间的路径长度乘以该节点的权值
7.树的带权路径长度:树的所有叶子节点的带权路径长度之和
十二、树和森林
1.树和二叉树的转换
2.规则:树的最左边节点作为二叉树的左子树,树的其他兄弟节点作为二叉树的右子树节点
3.采用连线发,将最左边节点和其兄弟节点都连接起来,而原来的父节点和兄弟节点的连线则断开
十三、查找二叉树、平衡二叉树
1.查找二叉树上的每个节点存储一个值,且每个节点的所有左孩子节点值都小于父节点值,而所有右孩子节点值都大于父节点值,是一个有规律排列的二叉树
2.二叉排序树的查找效率取决与二叉排序树的深度,对于结点个数相同的二叉排序树,平衡二叉树的深度最小,而单枝树的深度是最大的,故效率最差
3.平衡二叉树:任意左右子树层次相差不超过1
十四、图
1.图也是一种非线性结构,图中任意两个节点间都有可能有直接关系
2.无向图:图的节点之间连线时没有箭头的,不分方向
3.有向图:图的结点之间连接线时箭头,区分A到B,和B到A是两条线
5.完全图:无向完全图中,节点两两之间都有连线,N个节点的连线数为(n-1)+(n-2)...+1=n*(n-1)/2;
有向完全图,节点两两之间都有互通的两个箭头,n个节点的连线数为n*(n-1)
6.度、出度和入度:顶点的度是关联与该顶点的边的数目
有向图中,顶点的度为出度和入度之和
出度是以该顶点为起点的有向边的数目
入度是以该顶点为终点的有向边的数目
7.路径:存在一条通路,可以从一个顶点到达另一个顶点,有向图的路径也是有方向的
8.连通图和连通分量:争对无向图,若有向图任意两个顶点间都互相存在路径,即存在V到U,也存在U到V的路径,则称为强联通图,有向图中的极大连通子图称为其强连通分量
9.网:边带权值的图称为网
十五、图的存储
1.邻接矩阵:加速一个图中有n个节点,则使用N阶矩阵来存储这个图中各个节点的关系,规则是节点i到节点j有连线,则矩阵Ri,j=1,否则为0,因此,如果是一个无向图,肯定是沿对角线对称的,只需要存储上三角或者下三角就可以了,而有向图则不一定对称
2.邻接链表:用到了两个数据结构,先用一个一维数组将图中所有顶点存储起来,而后,对比一维数组的每个顶点元素,使用链表挂上和其有连线关系的结点的编号和权限,示例如下图:
十六、图的遍历
1.图的遍历是指从图的任意结点出发,沿这某条搜索路径对图中所有节点进行访问且只访问一次,分为以下两种方式:
深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任一其他节点出发,重复这个过程至遍历完整个图
广度优先遍历:先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似层次遍历
十七、图的最小生成树
1.最小生成树:假设有N个节点,那么这个图的最小生成树有n-1条,这N-1条边会将所有顶点都连接成一个树,并且这些边的权值之和最小
2.普里姆算法:从任意顶点出发,找出与其邻接的边权值最小的,此时此边的另外一个顶点自动加入树集合中,而后再从这个树集合的所有顶点中找出与其邻接的边权值最小的,同样此边的另外一个顶点加入树集合中,依次递归,直至所有顶点都加入树集合中,此时此树就是该图的最小生成树
3.克鲁斯卡尔算法(推荐):从边出发,选取权值最小的n-1条边,因此,就将边按权值大小排序,依次选取权值最小的边,直至囊括所有节点,要注意,每次选边后要检查不能形成环路
十八、图的拓扑序列
1.AOV(以顶点表示活动的网):再有向图中,以顶点表示活动,用有向边表示活动之间的优先关系
2.检测工程可行:先应检查对应的AOV网是否存在回路,检测的方法是对有向图构造其顶点的拓扑有序序列
3.构造方法:将有向图的有向边作为活动开始的顺序,若图中一个节点入度为0,则应该最先执行此活动,而后删除掉此节点和其相关的有向边,再去找图中其他没有入度的结点,执行活动,依次进行
十九、算法基础知识
1.算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作,算法的重要特性如下:
2.算法复杂度
注意:时间复杂度是一个大概的规模表示,一般以循环次数表示,O(n)说明执行时间是n的正比,另外,log对数的时间复杂度一般在查找二叉树的算法中出现,渐进符O表示一个渐进变化程度,实际变化必须小于等于O括号内的渐进变化程度
3.顺序查找:将待查找的关键字为key的元素从头到尾与表中元素进行比较,如果中间存在关键字为Key的元素,则返回成功,否则,则查找失败,时间复杂复杂度O(n)
4.折半(二分)查找:设查找表的元素存储在一维数组r[1,..n]中,在表中元素已经按照关键字递增方式排序的情况下,进行折半查找:
二十、排序
1.排序的分类:
稳定与不稳定排序,依据是两个相同的值在一个待排序序列中的顺序和排序后的顺序应该是相对不变的
2.内排序和外排序:依据排序是在内存中进行的还是在外部进行的
3.排序的算法很多:
插入类排序:直接插入排序、希尔排序
交换类排序:冒泡排序、快速排序
选择类排序:简单选择排序、堆排序
归并排序、基数排序
4.直接插入排序
例如:
思路:59依次向前比较,先和68比较,再和57比较,发现57比它小,才插入
5.希尔排序:是直接对插入排序算法的改进,适合于大数据的排序,采用分组的方法,可以提高效率
6.简单排序:每次选择最小的元素进行交换,主要是选择过程,交换过程只有一次
7.堆排序:依据给出的待排序关键字建立初始堆,输入堆顶元素,并调整堆
找到完全二叉树的最后一个非叶子节点(最后一颗子树),比较此非叶子节点和其两个孩子节点的大小,若小,则与其孩子节点中最大的节点进行交换
堆排序适用于多个元素中找出前几名的方案设计,因为堆排序是选择排序,而且选择出前几名的效率很高
8.冒泡排序:本质是从最后两个元素开始比较,将较小的元素交换到前面去,依次进行比较交换,较小的气泡浮到水面
9.快速排序:以57为界,左边都是小于57的元素,右边都是大于57的元素,完成一次快速排序,接着对两块分别进行递归
10.递归排序:用来合并多个线性表的,对单列数据,二路归并排序可以对元素进行两两合并
11.基数排序
基数排序是基于多个关键字来进行多轮排序,本质也是将问题细化,分别按个位、十位、百位的大小作为关键字进行三轮排序,最终得到结果
二十一、排序算法总结
1.稳定性:相等的两个元素相对位置在排序前后保持不变
2.空间复杂度中,大部分排序都是比较交换,无需多余空间,快速排序则是需要存储每次的基准值,归并排序需要一个新表,基数排序需要新表,还需要存储关键字的空间
3.时间复杂度中,与堆、树、二分有关的算法都是n*logn,直接的算法都是n*n
二十二、方法归类
1.递归:函数直接调用自己通过一系列语句间接调用自己,是一种描述问题和解决问题的常用方法
2.递归两个基本要素:边界条件、递归模式
3.分治法:对于一个规模为n的问题,若该问题可以容易地解决则直接解决,否则将分解为K个规模较小的子问题,这些问题互相独立且与原问题形式相同,递归解决这些子问题,然后各子问题的解合并得到原问题的解
4.凡是涉及到分组解决的都是分治法(二分查找、归并排序)
5.回溯法:先进行深度优先搜索,一直向下探测,当此路不通时,返回上一层探索另外的分支,重复此步骤,这就是回溯,意为先一直探测,当不成功时再返回上一层,一般用于解决迷宫类的问题
6.动态规划法:对于每一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃哪些肯定不能得到最优解的局部解,在每一步都经过筛选,以每一步都是最优解来保证全局最优,,此算法会将大量精力放在前期构造表格上,其会对每一步列出可能的答案,这些答案会存储起来,最终要得出某个结果时,是通过查询这张表来得到,动态规划发不但每一步最优,全局也最优
7.贪心法:总是做出在当前来说是最好的选择,而并不从整体上加以考虑,它所做的每一步选择只是当前步骤的局部最优选择,但从整体来说不一定是最优的选择,由于它不比为了寻找最优解而穷尽所有可能解,因此其耗费时间少,一般可以得到满意的解,但得不到最优解
8.局部贪心:只针对当前的步骤取最优,而非整体考虑,判断此类算法,就看算法是否每一步都取最优,并且整体没有透露出最终结果是最优的