[豪の学习笔记] 软考中级备考 基础复习#2
跟学视频:学以致知Learning - 软件设计师 基础阶段|考点理论精讲
Chapter 2 - 数据结构与算法基础
1 - 基本概念与三要素
数据:数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料
数据元素、数据项:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
数据结构的三要素:逻辑结构、物理结构(存储结构)、数据的运算
三要素
集合:各个元素同属一个集合,别无其他关系
线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继
树形结构:数据元素之间是一对多的关系
图结构:数据元素之间是多对多的关系
2 - 算法
算法的五个特性
有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成
确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合
输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量
算法效率的度量
- 时间复杂度:时间开销与问题规模n之间的关系
只保留最高的n方,多项相乘的时候要保留,忽略掉最高阶最高项的系数
- 空间复杂度:空间开销(内存开销)与问题规模n之间的关系
无论问题规模怎么变,算法运行所需的内存空间都是固定的常量
算法原地工作——算法所需内存空间为常量
只需关注存储空间大小与问题规模相关的变量
函数递归调用带来的内存开销:S(n) = O(n) 空间复杂度=递归调用深度
O(1)<O($\log_2 n$)<O(n)<O($n\log_2 n$)<O($n2$)<O($n3$)<O($2n$)<O(n!)<O($nn$)
3 - 线性表
定义
存储结构
插入删除操作
4 - 栈和队列
栈定义
栈(Stack)是只允许在一端进行插入或删除操作的线性表
队列定义
队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端称为队尾(Rear),允许删除元素的一端称为队头(Front)
循环队列
5 - 串、数组、矩阵和广义表
串
串是仅由字符构成的有限序列,是取值范围受限的线性表
- 空串:长度为零的串,空串不包含任何字符
- 空格串:由一个或多个空格组成的串
- 子串:由串中任意长度的连续字符构成的序列。含有字串的串称为主串。子串在主串中的位置指子串首次出现时,该子串的第一个字符在主串中的位置。空串是任意串的子串
- 串相同:指两个串长度相等且对应位置上的字符也相同
- 串比较:两个串比较大小时以字符的ASCII码值作为依据。比较操作从两个串的第一个字符开始进行,字符的ASCII码值大者所在的串大;若其中一个串先结束,则以串长较大者为大
数组
稀疏矩阵
广义表
6 - 树和二叉树
树的基本概念
二叉树的基本概念
二叉树的遍历
反向构造二叉树
树转二叉树
查找二叉树(二叉排序树)
左孩子小于根,右孩子大于根
例如序列:89、48、56、112、51、20
构造哈夫曼树(最优)
树的带权路径长度(树的代价)最小,每次组合找花费最小的两个
例:1、2、4、8
例:5、29、7、8、14、23、3、11
线索二叉树
平衡二叉树
任意结点的左右子树深度相差不超过1,每结点的平衡度只能为-1、0或1
7 - 图
基本概念
存储结构(邻接矩阵)
存储结构(邻接表)
首先把每个顶点的邻接顶点用链表表示出来,然后用一个一维数组来顺序存储上面每个链表的头指针
图的遍历
拓扑排序
我们用有向边表示活动之间开始的先后关系,这种有向图称为用顶点表示活动网络,简称AOV网络
上图的拓扑排序有:02143567、01243657、02143657、01243567
最小生成树(普利姆算法)
从起点开始一个一个向外扩展,每次找最短边,且不能形成环路,每加入一个结点则更新最小生成树与剩余未加入结点的距离
最小生成树(克鲁斯卡尔算法)
在整个图中找权值最小的连接,不形成回路
8 - 查找
基本概念
查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找
查找表(查找结构):用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成
关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的
查找长度:在查找运算中,需要对比关键字的次数称为查找长度
平均查找长度(ASL,Average Search Length):所有查找过程中进行关键字的比较次数的平均值
顺序查找
顺序查找,又叫“线性查找”,通常用于线性表
折半查找
折半查找,又称“二分查找”,仅适用于有序的顺序表
mid = (low + high)/2,往小取整
分块查找
块内无序,块间有序
第一步在索引表中确定待查记录所在的块,第二部在块内顺序查找
哈希表(散列表)
散列表(Hash Table),又称哈希表,是一种数据结构,特点是数据元素的关键字与其存储地址直接相关
若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词”
通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”
解决冲突的方法:开放地址、链地址、再哈希、建立一个公共溢出区
9 - 排序
基本概念
排序:排序就是重新排列表中的元素,使表中的元素满足按关键字有序的过程
稳定与不稳定排序:能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,则为稳定;反之则不稳定
内部排序与外部排序
插入类排序:直接插入排序、希尔排序
交换类排序:冒泡排序、快速排序
选择类排序:简单选择排序、堆排序
归并排序、基数排序
直接插入排序
算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成
希尔排序
算法思想:先将待排序表分割成若干形如 L[i,i+d,i+2d,……,i+kd] 的特殊子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止
冒泡排序
算法思想:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为一趟冒泡排序
快速排序
算法思想:在待排序表 L[1…n] 中任取一个元素pivot作为枢轴(或基准,通常为首元素),通过一趟排序将待排表划分为独立的两部分 L[1…k-1] 和 L[k+1…n],使得 L[1…k-1] 中的所有元素小于pivot, L[k+1…n] 中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或空为止,即所有元素放在了其最终位置上
简单选择排序
算法思想:每一趟在待排序元素中选取关键字最小的元素加入有序子序列
堆排序
设有n个元素的序列{K1,K2,… Kn},当且仅当满足下述关系之时,称之为堆
(1)$$ K_{i} \leq K_{2 i} $$ ; 且$$ K_{i} \leq K_{2 i+1} $$
(2)$$ K_{i} \ge K_{2 i} $$ ; 且$$ K_{i} \ge K_{2 i+1} $$
其中(1)称为小顶堆,(2)称为大顶堆
归并排序
算法思想:把两个或多个已经有序的序列合并成一个
基数排序
基数排序是一种借助多关键字排序思想对单逻辑关键字进行排序的方法
基数的选择和关键字的分解是根据关键字的类型来决定的,例如:关键字是十进制数,则按个位、十位来分解