考研必修课——数据结构

第一章-绪论

  1. 数据是客观事物的符号表示
  2. 数据元素是数据的基本单位。一个数据元素可由若干个数据项组成,数据项是数据不可分割的最小单位
  3. 数据对象是性质相同的数据元素的集合
  4. 数据结构是数据元素相互之间的关系。4种逻辑结构:(1)集合(2)线性(3)树形(4)图状/网状
  5. 逻辑结构:数据元素之间的逻辑关系
  6. 物理结构/存储结构:数据结构在计算机中的表示(又称映像)称为存储结构
  7. ADT三要素:数据对象,数据关系,基本操作
  8. 时间复杂度渐进时间复杂度的简称, T(n) = O(f(n))
  9. 算法分析的目的是为了比较谁快
  10. 算法分析的主要方面:时间复杂度(主要),空间复杂度(次要)
  11. 数据结构的形式定义:Data-structure=(D, R),其中D表示数据元素,R表示数据关系
  12. 数据类型的形式定义:Data-Type=(D, R, P),其中D表示数据对象,R表示数据关系,P表示基本操作
  13. 数据模型是由数据结构数据操作数据约束条件三部分组成
  14. 数据结构由数据的逻辑结构存储结构运算三部分组成

算法和程序的区别:

  • 算法是解决问题的步骤,程序是算法的代码实现;
  • 算法可以用流程图,自然语言,伪代码来表示,而程序是机器实际可执行的

第二章-线性表

  1. 线性结构的特点:1.只有一个首结点和一个尾结点2.除首尾结点外其他结点只有一个直接前驱和一个直接后继
  2. 线性表第i个元素ai的存储位置:LOC(ai)=LOC(a1)+(i-1)×L
  3. 顺序表的特点:逻辑上相邻的元素,物理上也相邻
  4. 链式表的特点:逻辑上相邻的元素,物理上不一定相邻
  5. 存取结构分为随机存取顺序存取
    随机存取就是直接存取,可以通过下标直接访问的数据结构,与存储位置无关,例如数组。非随机存取就是顺序存取,不能通过下标访问,只能按照存储顺序存取,与存储位置有关,例如链表。

顺序存取就是存取第N个数据时,必须先访问前(N-1)个数据
随机存取就是存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作。

第三章-栈和队列

  1. 是限定仅在表尾(即栈顶)进行插入或删除操作的线性表。
  2. 的五个基本操作:建栈、压栈、删除(弹出)、判断栈空和栈满
  3. top指向空的位置,即栈顶元素后一个的位置
  4. # 表示前一个字符无效,@ 表示当前行中的字符均无效
  5. 栈的特点:后进先出;队列的特点:先进先出
  6. 队列的假溢出现象:原本队列中还有空间,却认为空间已经满了。所以用循环队列来解决这个问题
  7. 队列长度:L=(rear-front+m)%m
    队满:front=(rear+1)%m
    队空:front=rear
    入队时新元素的位置:rear=(rear+1)%m
    出队时元素的位置:front=(front+1)%m
  8. 递归是自己调用自己,迭代是自己执行很多次。
  9. 递归算法需要有终止条件和递归部分,如果递归没有结束条件,那么就会无限递归下去。在编程的时候,没有递归结束条件或者递归过深,一般会造成栈溢出。
  10. 递归算法一般用于解决三类问题:
    (1)数据的定义是按递归定义的。(Fibonacci函数)
    (2)问题解法按递归算法实现。(回溯)
    (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)

第四章-串

  1. 是由零个或多个字符组成的有限序列
  2. 串中字符的数目n称为串的长度
  3. 零个字符的串称为空串,用符号“Ø”表示
  4. 由一个或多个空格组成的串称为空格串,空格串不等于空串,它的长度为串中空格字符的个数。
  5. 子串的个数:n(n+1)/2 + 1
  6. 用next数组解决字符串匹配的算法就叫做KMP算法
  7. next数组以“01”开头

附:
KMP算法讲解http://www.sohu.com/a/336648975_453160
next数组的求解https://blog.csdn.net/zhengjia0826/article/details/39895781
举例:
串“ ababaaababaa” 的next数组为:011234223456
串“ abcaabbcabcaabdab” 的next数组为:01112231123456712

第五章-数组和广义表

  1. 数组是一块连续的存储空间
  2. 矩阵的压缩存储是变换下标后用一维数组存储,为多个值相同的元只分配一个存储空间,对零元不分配空间(稀疏矩阵用三元组来压缩存储)
  3. 二维数组下标与位置关系:LOC(i,j)=LOC(0,0)+(b2×i + j)L
  4. 广义表一般记作:LS=(a1,a2,…,an)
    其中,LS是广义表的名称,n是它的长度。ai可以是单个元素,也可以是广义表,分为称为广义表LS的原子子表。广义表非空时,第一个元素a1为LS的表头(Head),其余元素组成的表是LS的表尾(Tail)。
  5. 广义表中的tail函数取出来的始终是一个表,即使只有一个简单的一个元素,tail取出来的也是一个表,而head取出来的可以是一个元素也可以是一个表。

第六章-树和二叉树

  1. 是n个结点的有限集
  2. 树的结点包含一个数据元素及若干指向其子树的分支
  3. 结点拥有的子树称为结点的度
  4. 度为0的结点称为叶子终端结点,不为0的结点称为非终端结点分支结点
  5. 树种结点的最大层次称为树的深度或高度
  6. 森林是m棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。
  7. 树的结构定义是一个递归的定义,即大树由若干棵小树组成。
  8. 二叉树的特点是每个结点至多只有两棵子树,并且二叉树有左右之分,其次序不能任意颠倒
  9. 如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树。在只有一棵树的情况下,二叉树有左右之分、有序树无左右之分
  10. 完全二叉树除掉最后一层,上面是满二叉树,最后一层是从右边开始缺少
  11. 二叉树的性质
    性质1:在二叉树的第i层上至多有2i-1个结点
    性质2:深度为k的二叉树至多有2k-1个结点
    性质3对任何一棵二叉树T,如果其终端结点数为n0,度为2的节点数为n2,则n0=n2+1
    性质4:具有n个结点的完全二叉树的深度为 ⌊ log ⁡ 2 n ⌋ + 1 \lfloor\log_2n \rfloor+1 log2n+1
  12. 二叉树的存储结构包括顺序存储结构和链式存储结构
  13. 遍历二叉树的几种算法:
    先序遍历二叉树的递归算法
Status PreOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){
//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit
//最简单的Visit函数是:
// 		Status PrintElement(TElemType e){//输出元素e的值
//			printf(e);                  //实用时,加上格式串
//			return OK;
//		}
	if(T){
		if(Visit(T->data))
			if(PreOrderTraverse(T->lchild),Visit)
				if(PreOrderTraverse(T->rchild),Visit) return OK;
		return ERROR;
	}else return OK;
}

中序遍历二叉树的非递归算法

Status InOrderTraverse(BiTree T,Status(* Visit)(TElemType e)){
	//采用二叉链表存储结构,Visit是对数据元素操作的应用函数
	//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
	InitStack(S);   Push(S,T);    //根指针进栈
	while(!StackEmpty(S)){
		while(GetTop(S,p) && p)
		Push(S,p->lchild);        //向左走到尽头
		Pop(S,p);                 //空指针退栈
		if(!StackEmpty(S))
			Pop(S,p); 
			if(!Visit(p->data)) return ERROR;
			Push(S,p->rchild);
		}
	}
	return OK;
}
  1. 以结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针,叫做线索
lchildLTagdataRTagrchild

其中:
L T a g = { 0 , l c h i l d 域 指 示 结 点 的 左 孩 子 1 , l c h i l d 域 指 示 结 点 的 前 驱 LTag= \begin{cases} 0 ,lchild域指示结点的左孩子\\ 1 ,lchild域指示结点的前驱\\ \end{cases} LTag={0lchild1lchild R T a g = { 0 , r c h i l d 域 指 示 结 点 的 右 孩 子 1 , r c h i l d 域 指 示 结 点 的 后 继 RTag= \begin{cases} 0, rchild域指示结点的右孩子\\ 1, rchild域指示结点的后继\\ \end{cases} RTag={0rchild1rchild
16. 赫夫曼树,又称最优二叉树,是一类带权路径长度最短的树
17. (赫夫曼编码)前缀编码:设计长短不等的编码,必须是任一字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码

第七章-图

  1. 图中的数据元素称作顶点。<v,w>表示从v到w的一条,且称v为弧尾或初始点,称w为弧头或终端点,此时的图称为有向图。(v,w)表示v和w之间的一条,此时的图称为无向图
  2. 有n(n-1)/2条边的无向图称为完全图,有n(n-1)条弧的有向图称为有向完全图
  3. 图的边或弧具有的与它相关的数叫做,带权的图称为
  4. 入度是进来的弧的数目,出度是出去的弧的数目
  5. 在无向图中,任意两个顶点都连通的图称为连通图,无向图中的极大连通子图称作连通分量
  6. 在有向图中,任意两点间都存在路径的图称为强连通图,有向图中的极大强连通子图称强连通分量
  7. 图的结构常用邻接表和邻接矩阵来存储
  8. 普点卡边:构造最小生成树的两种算法中普里姆算法按点优先克鲁斯卡尔算法按边优先
  9. 拓扑排序是由某个集合上的一个偏序得到该集合上的一个全序。
  10. 有向图的拓扑排序过程:先选择一个没有入度的字母,选择后将它的出度全部删去,再选择下一个没有入度的字母,依次重复上述操作
  11. 采用邻接表存储的图的深度优先遍历算法类似于树的先序遍历,而其广度优先遍历算法类似于树的按层次遍历
  12. AOV网是以顶点表示活动的网,AOE网的含义是以边表示活动的网
  13. AOE网中路径长度最长的路径叫做关键路径,关键路径上的所有活动都是关键活动
  14. 对于G中某个顶点v,若从G中删去顶点v及与顶点v相关联的边后,G变成由两个或两个以上非空连通分量所组成的图,则称v是原来图G的一个关节顶点。

附:AOE网活动的最早、最迟发生时间及关键路径问题https://blog.csdn.net/qq_38071429/article/details/80407544

第九章-查找

  1. 二叉排序树又称二叉查找树,它或是一颗空树,或是具有以下性质的二叉树:左子树的所有结点均小于它的根结点的值,右子树的所有结点均大于根结点的值,它的左右子树也分别为二叉排序树
  2. 平衡二叉树又称AVL树,它或是一颗空树,或是具有以下性质的二叉树:它的左右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
  3. 二叉树上结点的平衡因子为该结点的左子树的深度减去它的右子树的深度。平衡二叉树上所有结点的平衡因子只可能是-1,0和1。
  4. 平均查找长度ASL与树的形态有关
  5. 线性探测再散列的哈希表查找成功时的平均查找长度为:Snl ≈ (1 + 1/(1-a)) / 2
  6. 随即探测再散列、二次探测再散列和再哈希的哈希表查找成功时的平均查找长度为:Snr ≈ - (ln(1-a)) / a
  7. 链地址法处理冲突的哈希表查找成功时的平均查找长度为:Snc ≈ 1+a/2

第十章-内部排序

  1. 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列重新排列成一个按关键字有序的序列
  2. 若序列中两个相等的记录排序后位置依然不变则称所用的排序方法是稳定的,反之,若位置互换则称所用的排序方法是不稳定的
  3. 内部排序指待排序记录存放在计算机随机存储器中进行的排序过程
  4. 外部排序指待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程
  5. 大顶堆是堆顶元素(完全二叉树的根)取最大值的完全二叉树,小顶堆是堆顶元素取最小值的完全二叉树
  6. 几种排序实例:
    起泡排序的特点是待排序元素相邻两两比较,逆序交换,每趟有一个最大元素到达底部(或一个最小元素到达顶部)
    选择排序的特点是第一趟在待排序元素中选最小(或最大)元素和第一个元素交换,第二趟在未排序元素中选次小(或次大)和第二个元素交换。
    二路归并排序是两两归并,再四四归并
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

写在后面:
数据结构复习到现在已经复习整整五天了,一学期基本没听的课,从第七章往后就没再认真看了,只是粗略的看了一下几个知识点,毕竟还有两天就考试了,而我还有四门课没开始复(yu)习(xi)…再不结束数据结构我放弃的就不是一门两门了,等考研再回过头看数据结构吧

最后:数据结构与算法可视化平台

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值