一单元:数据结构
数据:是能被计算机识别,并输入给计算机处理的符号集合。【 注意:声音、图像、视频也属于数据。】
数据元素:是数据的的基本单位,也被称为记录。
数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。【关系:数据>数据元素>数据项】
数据对象:是性质相同的数据元素的集合,是数据的子集。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
逻辑结构:是数据元素之间的相互关系。
数据的逻辑结构
(1)集合结构 都在一个集合里
(2)线性结构 一对一
(3)树形结构 一对多
(4)图形结构 多对多
存储结构(物理结构):是指数据的逻辑结构在计算机中的存储形式。
(1)顺序存储结构:逻辑相邻,物理上也相邻
(2)链式存储结构:逻辑相邻,物理上不一定相邻
数据类型:是指一组性质相同类型的值的集合及定义在集合上的操作的总称。
(1)原子类型(基本类型)
(2)结构类型(构造类型)
抽象数据类型:是一个数据模型,以及定义在该模型上一组操作。
二单元:结构体
定义结构体变量
struct 结构体名 变量名
引用成员变量
struct 结构体名 变量名;
变量名.成员变量;
struct student a;
-
name a.age
-
结构体指针 a->name a->age
定义结构体数组是,必须在数组后有一对[ ]
三单元:算法的特性
程序=算法+数据结构
算法的概念:
1)解决问题的方法和步骤
2)算法是描述解决问题的方法,是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列。
算法的特性
1)输入 0-N个
2)输出 1-N个 必须有输出
3)有穷性 算法在有限步内结束,每一步在有限时间内完成
4)确定性 算法没有二义性、模糊性,不可以模棱两可
5)可行性 算法每一步都是可行的
四单元:算法的设计要求
1)正确性 算法应当满足具体问题的需求,能正确完成需求
2)可读性 算法设计目的是为了便于阅读、理解和交流
3) 健壮性 算法应该能对输入数据不合法的情况做合适的处理
4)时间效率高存储量低 执行时间短的算法效率高,执行时间长的效率低。
存储量需求指算法执行过程中所需要的最大存储空间
时间复杂度:T(n)=O(f(n)) n是问题的规模 f(n)是n的函数 O表示渐近符号
空间复杂度:S(n)=O(f(n))
算法效率的度量方法:
1)事后统计方法
2)事前分析估算的方法
时间复杂度 O(1) 常数阶
O(log2n) 对数阶
O(n) 线性阶
O(nlog2n)线对阶
O(n*n) 平方阶
O(n*n*n) 立方阶
O(2^n) 指数阶
O(1)< O(log2n)< O(n)< O(nlog2n)< O(n2)< O(n3)< O(2n)
五单元:线性表
线性结构特点:存在唯一的一个称为“第一个”的元素,存在唯一的一个称为“最后一个”的元素,除第一个元素每个元素都要唯一的前驱,除最后一个元素每一个元素都有唯一的后继
线性表:n个元素的有限序列
线性表采用顺序存储称为顺序表
n个元素的顺序表,插入第i个位置元素需要移动【n-i+1】个元素 平均移动【n/2】个元素 时间复杂度 O(n)
n个元素的顺序表,删除第i个位置元素需要移动【n-i】个元素 平均移动【(n-1)/2】个元素 时间复杂度 O(n)
顺序表中,插入、删除要平均移动约表中一半的元素
顺序表操作的时间复杂度
插入 O(n) //在第i个位置插入元素
删除 O(n) //删除第i个元素
查找 O(1) //查找第i个元素
修改 O(1) //修改第i个元素
优点:可以随机存取任意位置的元素,即查找、修改方便。
缺点:(1)插入、删除要移动大量的元素。
(2)设置最大容量时过大容易浪费,过小容易溢出。
(3)造成存储空间的碎片
线性表采用数组来实现也被称为顺序表其优点有:查找数据方便,修改数据方便,空间利用率高,因为有定位公式也就是下标;其缺点有:插入、删除数据时不方便,因为要移动大量的数据,还有缺点是,空间大小不稳定,可能造成极大的空间浪费;
顺序表是线性表采用顺序存储方式,链表是线性表采用链式存储结构,其优点是插入删除简单,不需要移动大量元素,缺点是查找修改比较繁琐,要从第一个数据开始往后查,空间利用率低,因为他需要额外申请空间去保存地址;
结构体变量、结构体数组、结构体指针都可以当做函数的参数进行传递,
在具有n个元素的顺序表中进行插入操作,平均需要移动多少个元素:最少移动0个,最多移动n个,平均移动n/2个;
删除平均移动的n-1/2个;
插入 删除 查找 修改
顺序表: o(n) o(n) o(1) o(1)
链表: o(1) o(1) o(n) o(n)
经常需要插入删除,使用链表方便,经常需要修改查找,使用顺序表;
在指针p指向的节点后面插入s结点
s->next=p->next;将p结点后面的结点的地址(p->next),将他的地址赋值给s结点的指针域。
p->next=s;将s结点本身的地址赋值给p结点的指针域。
将p结点后面的结点删除:p->next=p->next->next=k;
六单元:链表
链表是线性表的链式存储结构
链式存储结构:在逻辑上相邻的元素在物理上不一定相邻。
每个结点都包含两部分:数据域和指针域。
每个结点只含有一个指针域的链表称为单链表。
单链表中,在p指针指向的结点后插入s指针指向的结点的语句序列是: s->next=p->next p->next=s;
在单链表中,删除p指针指向的直接后继的语句是: p->next=p->next->next;
链表操作时间复杂度分析
插入 O(1) //在p指针指向的结点后插入s指针指向的结点
删除 O(1) //删除p指针指向的直接后继
查找 O(n) //查找链表的第i个元素
修改 O(n) //修改链表的第i个元素为e
优点:(1)插入、删除元素方便,避免移动大量的元素。
(2)几乎不存在溢出的状况
缺点:需要额外的空间来存储指针域
七单元:栈
操作受限的线性表
插入和删除都在表尾(栈顶)
先进后出(后进先出) FILO表或者LIFO表
栈顶指针top 当top = -1时代表空栈,top=MAX-1时,满栈
入栈操作:S.top++; S.data[s.top] = e;
出栈操作:e = S.data[S.top]; S.top--;
栈的应用:保存现场、函数调用时
栈是限定只在表尾进行插入和删除的线性表
栈的插入又叫:压栈、入栈、进栈
栈的删除又叫:出栈、弹栈
进栈push;压
出栈pop弹
能插入删除的一端叫栈顶。
八单元:栈的应用
斐波那契数列,递归应用,进制转换,括号匹配,表达式求值(两个栈,一个数据栈一个符号栈)、n的k次幂…
递归的应用:1、求和2、求阶乘3、斐波那契4、n的k次幂求值5、汉诺塔问题6、过河7、米兰国旗8、迷宫问题9、八皇后;
栈的应用:1、递归的问题,递归是需要栈辅助完成的2、进制转换3、表达式求值4、括号匹配5、保存现场;
九单元:队列
特性:先进先出,操作受限的线性表;FIFO表
队列只允许在一端进行插入,在另一端进行删除的线性表
队尾插入,队头删除
队满:S.ear == MAX-1
队空:S.rear == S.front
入队:S.data[S.rear] = e; S.rear++;
出队:e = S.data[S.front]; s.front++;
队头和队尾相等时,也就是front = rear的时候 队空 rear = MAX-1时,队满
给客服打电话,需要等待,这时候就是一个队列,先打的先被接
队列的应用:1、操作系统的作业调度。2、离散事件的模拟。3、消息的缓存;
队尾指针永远指向下一个为空的地方。
十单元:树
结点拥有的子树称为该结点的度
一棵树只有一个根节点
树的深度:看树有几层,根为第一层,根的孩子第二层....
树的存储:双亲表示法、孩子表示法、孩子兄弟表示法
度:针对结点,也针对树
高度/深度:针对树本身
叶子:度为0
分支:度不为0
双亲:某结点直接前驱
孩子:某结点后继
兄弟:同一个双亲
堂兄弟:双亲在同一层,但不是同一个
十一单元:二叉树的定义
二叉树:度最大为2
满二叉树:所有度为0的结点(叶子)都在同一层,所有非叶子结点的度都是2
完全二叉树:将满二叉树的叶子从右往左摘,所有叶子都在倒数两层
满二叉树叶子最多,结点最多;
有i层的树:最多有-1个结点
第i层最多有个结点
针对完全二叉树:度为2的结点比度为0的结点大1:n0 + 1 = n2
有N个结点的完全二叉树,最多有层
N个结点的完全二叉树,第i个结点如果有左孩子,左孩子结点是2i
N个结点的完全二叉树,第i个结点如果有右孩子,右孩子结点是2i+1
二叉树的五大形态:
空树、根节点、根结点只有左子树、根结点只有右子树、根节点既有左又有右子树
二叉树的左子树和右子树是有顺序的,不能任意颠倒
十二单元:二叉树的遍历
先序:根、左、右
中序:左、根、右
后续:左、右、根
先序和中序、中序和后续 这两种组合可以恢复原数
先序和后续 不可以恢复原树
周考题:
已知先序ABCDEF,中序BDCFEA,推出后序:DFECBA
二叉树是有序树
二叉树分为:1空二叉树2左斜3右斜4满二叉树(叶子与结点最多)5完全二叉
树
深i层二叉树最多2的i次方减1
第i层二叉树最多2的i减1次方
N个结点,二叉树最少1+log2n
设度为2的二叉树结点个数为n n+1
十三单元:图
图:顶点的非空集和边的集合构成(边可以为空,顶点不能为空)
边:用来描述顶点之间的关系
有向边:构成有向图
无向边:构成无向图
完全图:所有顶点之间都有边
权:边上的数字,或者弧上的数字
网:由权组成的图称为网
出度/入度:针对有向图,出度是说从这个顶点出去的弧,入度是说到这个顶点的弧
有向图的边又称作弧
图的存储:邻接表(一个数组一个链表)、邻接矩阵(两个数组)、十字链表(邻接表和逆邻接表)
查找方法两种1、顺序查找2、折半查找;
顺序查找的前提:顺序存储;
折半查找的前提:顺序存储,记录有序;
查找表两种:1、静态查找表2、动态查找表;
静态查找表:查找表中记录固定,只查找不改变集合内的元素;
动态查找表:查找表中的记录,通过查找的过程,动态生成,即查找有改变集合内的元素;
关键字:记录中某个数据项的值;
主关键字:可以唯一标识一个记录;
次关键字:标识若干记录的关键字;
查找表属于集合结构;
顺序查找的思想:采用一次比较的方式来查找关键字;
折半查找的思想:与记录的中间值相比较,如果比中间值小去左边查找,否则去右边查找,直到找到为止;
十五单元、十四单元:查找
查找:在一组序列中找到某个记录的位置
分:静态查找表、动态查找表
分:顺序查找(逐一比较)、折半查找(二分查找)
分:主关键字(唯一)、次关键字(若干)
顺序查找分:普通和优化两个版本,优化的代码:比较的次数大幅度减少
中序遍历:是升序序列
折半查找:前提是顺序存储、记录有序
静态查找表:只查找,不改变
动态查找表:边查找,边改变,一般使用在二叉排序树
顺序查找:时间复杂度是O(n),
折半查找:时间复杂度O(log2n),
二叉排序树:左子树所有结点小于根结点,右子树所有结点都大于根
二叉排序树:是升序序列,按照中序遍历
动态查找:借助二叉排序数来实现动态查找;
二叉排序数:要么是一个空数,要么具备以下
左子数的所以结点都小于根节点的值
游字数的所有结点都大于根节点的值
它的左右字数也分别是儿茶字数递归()
二叉排序数的与折半查找类似,都是每次舍弃将近一半的元素,查找效率高
中序遍历二叉排序数将会得到一个非递减序列(递增)
二差排序树如果查找失败则将被查找的元素动态添加到二差排序树中,添加的必须是叶子
十六单元:插入排序
时间复杂度O(n*n),稳定排序。
排序:将一组无序的记录整合成一组有序的记录
最好情况每个记录只需要比较1次就找到位置,这样时间复杂度是O(n)
最坏情况,每个记录需要比较n次才能找到位置,这样时间复杂度是O(n*n)
排序分四类:1、插入排序2、交换排序(冒泡)3、选择排序4、归并排序
排序:将一组无序的记录按照某关键字,排列成有序的;
插入排序的时间复杂度:On2;
N个等待排序的记录使用直接插入排序,需要n-1趟就能完成全部排序;
直接插入排序思想:将第一个记录看成有序,将之后的记录逐一插入,使有序数列逐渐扩大,直到全部有序
N个记录采用直接插入排序最好的情况是记录有序,只需比较N-1次,不需要插入就可以完全插入
直接插入排序的核心理念是通过插入数据来完成排序
排序也可以分为内排序和外排序
内排序:在排序构成中需要借助内存空间来帮助完成排序(排序只在内存中完成就叫内排序)
外排序:排序在内存和外存之间交替进行;
十七单元:冒泡排序
时间复杂度O(n*n),稳定排序。 最好的情况一趟排序就好,此时时间复杂度是O(n)
最坏情况 n-1次排序完成,此时时间复杂度O(n*n)。
N个记录最多需要N-1趟排序
属于四大排序中的交换排序。
十八单元:快排
时间复杂度O(nlog2n),不稳定排序。采用的是递归的思想。
属于四大排序中的交换排序,针对越乱的数据排序速度越快,越有序越体现不了优势
十九单元:选择排序
时间复杂度O(N*N) 不稳定排序 每一趟的时间复杂度是O(n)
N个元素最多需要比较(N-1)趟,每趟最多比较(N-1)次,每趟最多交换1次元素
属于四大排序中的选择排序