第九章:数据结构与算法
考点1:矩阵
-
数组
-
矩阵:计算时采用带点排除法,注意一维数组的起始位置
考点2:表
-
线性表
-
顺序表:顺序存储,即用一组地址连续的存储单元依次存储线性表中的数据元素
-
链表:链式存储,即通过指针链接起来的结点来存储数据元素
-
单链表:每个结点中除包含数据域外,只设置一个指针域用以指向其直接后继结点
-
双链表:每个结点中除包含数值域外,设置两个指针域,分别用以指向直接前驱结点和直接后继结点
-
循环链表:头结点的指针域指向尾结点的指针域
-
-
队列(先进先出)和栈(先进后出)
- 循环队列
- 队空条件:head=tail;
- 队满条件:(tail+1)%size=head
- 解题技巧
- 按照一定顺序输入栈,那么出栈的可能有很多,因为进去的同时就立马出去
- 队列和栈结合时,将选项带入,使用两者的规则进行选择
- 循环队列
-
-
广义表
- 广义表是n个表元素组成的有限序列,是线性表的推广,LS=(a0, a1,…, an)。
- 长度(最外层表(LS)含有多少个元素),深度(包含括号的重数)
- 取表头head(Ls)(最外层表的第一个元素),取表尾tail(Ls)(除了最外层表中第一个元素之外的其他所有元素)
考点3:树
- 树与二叉树的特性
- 树的概念
- 孩子(结点的子树的根称为该结点的孩子)、双亲(该结点称为其子结点的双亲)、和兄弟(具有相同双亲的结点互为兄弟)
- 结点的度:一个结点的子树的个数
- 叶子节点(终端结点):指度为0的结点
- 内部结点(分支节点):指度不为0的结点
- 结点的层次:若某节点在第i层,则其孩子结点在第i+1层
- 树的深度:一颗树的最大层次数
- 二叉树的特性
- 在二叉树的第i层上最多有2i-1个结点(i≥1);
- 深度为k的二叉树最多有2k -1个结点(k≥1);
- 对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。
- 如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到 L log2n ˩+1层,每层从左到右),则对任一结点i(1≤i≤n),有:
- 如果i=1,则结点i无父结点,是二叉树的根;如果i>1,则父结点是L i/2 ˩ ;
- 如果2i>n,则结点i为叶子结点,无左子结点;否则,其左子结点是结点2i;
- 如果2i+1>n,则结点i无右子叶点,否则,其右子结点是结点2i+1。
- 树的概念
- 特殊的二叉树
- 二叉树:二叉树是每个结点最多有两个孩子的有序数,可以为空树,可以只有一个结点。
- 满二叉树:任何结点恰有两棵非空子树
- 完全二叉树:最多可以有两个叶子结点,并且都在左边
- 平衡二叉树:树中任一结点的左右子树高度之差不超过1
- 排序二叉树:任一结点的权值,大于其左孩子结点,小于其右孩子结点。
- 线索二叉树:在每个结点中增加两个指针域来存放遍历时得到的前驱和后继信息。
- 最优二叉树:又称为哈弗曼树,它是一类带权路径长度最短的树。
- 路径长度:从树根到每一个叶子结点的通路数目之和。
- 结点的带权路径长度:路径长度与该结点权值的乘积。
- 树的带权路径长度:树中所有叶子结点的带权路径长度之和。
- 哈弗曼树的构造
- 根据给定的权值集合,找出最小的两个权值,构造一棵子树最为其孩子结点,二者权值之和作为根结点
- 在原集合中删除这两个结点的权值,并引入根节点的权值
- 重复步骤(1)和步骤(2),直到原权值集合为空
- 树的遍历
- 先序遍历:按根à左à右的顺序进行遍历
- 后序遍历:按左à右à根的顺序进行遍历
- 中序遍历:按左à根à右的顺序进行遍历
- 层次遍历:按层次顺序进行遍历
考点4:图
-
完全图
- 在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图
- 在有向图中,若每对顶点之间都有二条有向边相互连接,则称该图为完全图
-
图的存储
-
邻接矩阵:具有对称性,存储时可以只存出其中一个三角
-
邻接表:首先把每个顶点的邻接顶点用链表示出来,然后用一个一维数组来顺序存储上面每个链表的头指针
-
图的遍历
-
图的拓扑排序:在AOV网点中从顶点Vi到Vj用有向边表示活动开始的顺序
-
最小生成树
- 选择入度为0的顶点作为起点
- 选择顶点之间最短(代价最小)路径的几条边,不能形成环路
-
考点5:算法基础及常见算法
- 算法的特性
- 有穷性:执行有穷步之后结束
- 确定性:算法中每一条指令都必须有确切的含义,不能含糊不清
- 输入(>=0),输出(>=1)
- 有效性(可行性):算法的每个步骤都能有效执行并能得到确定的结果。例如a=0,b/a就无效
- 分治法
- 特征:把一个大问题拆分成多个小规模的相同子问题,一般可用递归解决。
- 经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
- 动态规划法(用于求最优解)
- 特征:划分子问题(最优子结构),并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果
- 经典问题:斐波那契数列、矩阵乘法、背包问题、 LCS最长公共子序列
- 回溯法(通用的解题法)
- 特征:包含问题的所有解的树中,按照深度优先的策略,从根节点出发搜索树。系统的搜索一个问题的所有解或任一解
- 经典问题:N皇后问题、迷宫、背包问题
- 贪心法(用于求满意解)
- 特征:局部最优,但整体不见得最优。每步有明确的,既定的策略
- 经典问题:背包问题(如装箱)、多机调度、找零钱问题
考点6:时间复杂度与空间复杂度(★★★★★)
-
时间复杂度:程序运行从开始到结束所需要的时间
-
常见时间复杂度排序:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)
- O(1):单个语句,无循环
- O(n)~O(n3):单层循环、双层嵌套循环、三层嵌套循环
- O(log2n):树形结构、二分法、构建堆过程
- O(nlog2n):堆排序、归并排序
- O(2n):所有不同可能的排列组合
-
主定理求固定形式递归式的时间复杂度
-
-
空间复杂度:算法在运行过程中临时占用存储空间大小
考点7:排序和查找
-
查找
-
顺序查找:将待查找的关键字依次与表中元素进行比较,时间复杂度为O(n)
-
二分法查找:比较次数最多为log2n +1 ,时间复杂度为 O(log2n),
-
确定中点位置:mid=(low+high)/2
-
将待查的值K与R[mid].key比较
-
若R[mid].key>k,新的查找区间是左子表,其中high=mid–1。
-
若R[mid].key< k,新的查找区间是右子表,其中low=mid+1。
-
若R[mid].key=k,则查找成功,算法结束。
-
例题:请给出在含有12个元素的有序表{1,4,10,16,17,18,23,29,33,40,50,51}中二分查找关键字17的过程。
-
-
散列表查找:已知关键字集合U,最大关键字为m,根据函数Hash的值存储到对应的空间
-
开放定址法:按照某种探测方法,逐个查找此地址中是否存储了数据元素,如果没有,将关键字存入,否则,继续查找下一个地址
- 线性探测法:将关键字存储在下一个没有被占的位置
- 伪随机数法:随机的将关键字存储在没有被占的位置
-
例题:记录关键码为(3,8,12,17,9),取m=10(存储空间为10),p=5,散列函数h=key%p
-
-
-
排序
-
直接插入排序
- 排序规则:第i个记录Ri依次与Ri-1,…,R2,R1进行比较,找到合适的位置插入
- 特点:效率低
-
希尔排序
-
排序规则
- 取一个小于n的整数d1将记录分成d1个组,距离为d1的倍数的记录放在同一个组中,各组内进行直接插入排序
- 取第二个增量d2<d1重复1步骤,直至所取的增量dt=1,将最后得到的组进行直接插入排序即可
-
特点:效率高
-
-
直接选择排序
-
排序规则
-
在所有记录中选出排序码最小的记录,把它与第1个记录交换
-
在其余的记录内选出排序码最小的记录,与第2个记录交换……依次类推,直到所有记录排完为止
-
-
堆排序
- 堆的定义:设有n个元素的序列{K1,K2,…,Kn}
- 若Ki ≤ K2i 且 Ki ≤ K2i +1,称为小顶堆
- 若Ki ≥ K2i 且 Ki ≥ K2i +1,称为大顶堆
- 排序规则:先将序列建立堆,然后输出堆顶元素,再将剩下的序列建立堆,然后再输出堆顶元素,依此类推,直到所有元素均输出为止
- 将顺序表R[1…n]中元素建立为一个堆,堆顶位于R[1],待序区为R[1…n]
- 循环执行步骤3~步骤4,共n-1次
- 假设为第i 运行,则待序区为R[1…n-i+1],将堆顶元素R[1]与待序区尾元素R[n-i+1]交换,此时顶点元素被输出,新的待序区为R[1…n-i ]
- 待序区对应的堆已经被破坏,将之重新调整为大顶堆
- 堆的定义:设有n个元素的序列{K1,K2,…,Kn}
-
冒泡排序
-
排序规则:通过相邻元素之间的比较和交换,将排序码较小的元素逐渐从底部移向顶部
-
-
快速排序
-
排序规则:将原问题分解成若干个规模更小但结构与原问题相似的子问题。通过递归地解决这些子问题,然后再将这些子问题的解组合成原问题的解
- 在待排序的n个记录中任取一个记录作为基准
- 使用基准和最后一个元素作比较
- 然后用第二个元素和基准作比较,依次类推,最后基准在中间
-
-
归并排序
-
排序规则
- 将两个或两个以上的有序子表合并
- 比较A[i]和A[j]的排序码大小,若A[i]的排序码小于等于A[j]的排序码,则将第一个有序表中的元素A[i]复制到R[k]中,并令i和k分别加1
- 如此循环下去,直到其中一个有序表比较和复制完,然后再将另一个有序表的剩余元素复制到R中
-
-
基数排序
- 排序规则:基数的选择和关键字的分解是根据关键字的类型来决定的,例如关键字是十进制数,则按个位、十位来分解
-
视频来源 软件设计师