最新数据结构考研讲义
绪论 (3)
0.1 基本概念 (3)
第一章线性表 (4)
1.1 线性表的定义 (4)
1.2 线性表的实现 (4)
1.2.2 线性表的链式存储结构 (6)
第二章栈、队列和数组 (11)
2.1 栈 (11)
2.2 队列 (15)
2.3 特殊矩阵的压缩存储 (17)
2.3.1 数组 (17)
2.3.2 特殊矩阵 (17)
第三章树与二叉树 (20)
3.1 树的概念 (20)
1.树的定义 (20)
2.相关术语 (20)
3.2 二叉树 (21)
3.2.1 定义与性质 (21)
3.2.2 二叉树的存储 (22)
3.2.3 二叉树的遍历 (23)
数据结构与算法考研真题3.2.4 线索二叉树 (25)
3.3 树和森林 (29)
3.3.1 树的存储结构 (29)
3.3.2 森林和二叉树的转换 (30)
3.4 哈夫曼(Huffman)树和哈夫曼编码 (31)
第四章图 (32)
4.1 图的概念 (32)
4.2 图的存储及基本操作 (33)
4.2.1 邻接矩阵 (33)
4.2.2 邻接表 (33)
4.3 图的遍历 (35)
4.3.1 深度优先搜索 (35)
4.3.2 广度优先搜索 (35)
4.4 图的基本应用 (37)
4.4.1 最小生成树 (37)
4.4.2 最短路径 (37)
4.4.3 拓扑排序 (39)
4.4.4 关键路径 (40)
第五章查 (42)
5.1 查的基本概念 (42)
5.2 顺序查法 (43)
5.3 折半查法 (44)
5.4 动态查树表 (45)
5.4.1 二叉排序树 (45)
5.4.2 平衡二叉树 (47)
5.4.3 B 树及其基本操作、B+树的基本概念 (49)
5.5 散列表 (51)
5.5.2 常用的散列函数 (51)
5.5.4 散列表的查 (52)
5.5.5 散列表的查分析 (53)
第六章排序 (54)
6.1 插入排序 (54)
6.1.1 直接插入排序 (54)
6.1.2 折半插入排序 (54)
6.2 冒泡排序 (55)
6.3 简单选择排序 (56)
6.4 希尔排序 (57)
6.5 快速排序 (58)
6.6 堆排序 (60)
6.7 二路归并排序 (62)
6.8 基数排序 (63)
6.9 各种内部排序算法的比较 (64)
绪论
0.1 基本概念
1、数据结构
数据结构是指互相之间存在着一种或多种关系的数据元素的集合。
数据结构是一个二元组Data_Structure =(D,R),其中,D 是数据元素的有限集,R 是D 上关系的有限集。
2、逻辑结构:是指数据之间的相互关系。通常分为四类结构:
(1)集合:结构中的数据元素除了同属于一种类型外,别无其它关系。
(2)线性结构:结构中的数据元素之间存在一对一的关系。
(3)树型结构:结构中的数据元素之间存在一对多的关系。
(4)图状结构:结构中的数据元素之间存在多对多的关系。
3、存储结构:是指数据结构在计算机中的表示,又称为数据的物理结构。通常由四种基本的存储方法实现:
(1)顺序存储方式。数据元素顺序存放,每个存储结点只含一个元素。存储位置反映数据元素间的逻辑关系。存储密度大。但有些操作(如插入、删除)效率较差。
(2)链式存储方式。每个存储结点除包含数据元素信息外还包含一组(至少一个)指针。指针反映数据元素间的逻辑关系。这种方式不要求存储空间连续,便于动态操作(如插入、删除等),但存储空间开销大(用于指针),另外不能折半查等。
(3)索引存储方式。除数据元素存储在一组地址连续的内存空间外,还需建立一个索引表,索引表中索引指示存储结点的存储位置(下标)或存储区间端点(下标)。
(4)散列存储方式。通过散列函数和解决冲突的方法,将关键字散列在连续的有限的地址空间内,并将散列函数的值解释成关键字所在元素的存储地址。其特点是存取速度快,只能按关键字随机存取,不能顺序存取,也不能折半存取。
2 算法和算法的衡量
1、算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。
算法具有下列特性:⑴有穷性⑵确定性⑶可行性⑷输入⑸输出。
算法和程序十分相似,但又有区别。程序不一定具有有穷性,程序中的指令必须是机器可执行的,而算法中的指令则无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。一个算法若用程序设计语言来描述,则它就是一个程序。
2、算法的时间复杂度:以基本运算的原操作重复执行的次数作为算法的时间度量。一般情况下,算法中基本运算次数T(n)是问题规模n(输入量的多少,称之为问题规模)的某个函数f(n),记作:
T(n) =Ο(f(n));也可表示T(n) =m(f(n)),其中m 为常量。记号“O”读作“大O”,它表示随问题规模n 的增大,算法执行时间T(n)的增长率和f(n)的增长率相同。
注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。
常见的渐进时间复杂度有:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<Ο(2n) <O(n!) <O(nn)。
3、算法的空间复杂度:是对一个算法在运行过程中临时占用的存储空间大小的量度。只需要
分析除输入和程序之外的辅助变量所占额外空间。
原地工作:若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作,空
间复杂度为O(1)。
第一章线性表
1.1 线性表的定义
线性表是一种线性结构,在一个线性表中数据元素的类型是相同的,或者说线性表是由同一类型的数据元素构成的线性结构,定义如下:
线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,通常记为:
(a1,a2,…ai-1,ai,ai+1,…an)
其中n为表长,n=0 时称为空表。
需要说明的是:ai为序号为i 的数据元素(i=1,2,…,n),通常将它的数据类型抽象为ElemTy
pe,ElemType根据具体问题而定。
1.2 线性表的实现
1.2.1 线性表的顺序存储结构
1.顺序表
线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称其为顺序表。因为内存中的地址空间是线性的,因此,用物理上的相邻实现数据元素之间的逻辑相邻关系是既简单又自然的。
设a1的存储地址为Loc(a1),每个数据元素占d个存储地址,则第i个数据元素的地址为:
Loc(ai)=Loc(a1)+(i-1)*d 1≤i≤n
这就是说只要知道顺序表首地址和每个数据元素所占地址单元的个数就可求出第i个数据元素的地址来,这也是顺序表具有按数据元素的序号随机存取的特点。
线性表的动态分配顺序存储结构:
#define LIST_INIT_SIZE 100 //存储空间的初始分配量
#define LISTINCREMENT 10 //存储空间的分配增量
typedef struct{
ElemType *elem; //线性表的存储空间基址
int length; //当前长度
int listsize; //当前已分配的存储空间
}SqList;
2.顺序表上基本运算的实现
(1)顺序表的初始化
顺序表的初始化即构造一个空表,这对表是一个加工型的运算,因此,将L设为引用参数,
首先动态分配存储空间,然后,将length置为0,表示表中没有数据元素。
int Init_SqList (SqList &L){
L.elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) exit (OVERFLOW); //存储分配失败
L.length=0;
L. listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}
(2)插入运算
线性表的插入是指在表的第i(i的取值范围:1≤i≤n+1)个位置上插入一个值为x 的新元素,
插入后使原表长为n的表:
(a1,a2,... ,ai-1,ai,ai+1,... ,an)
成为表长为n+1 表:
(a1,a2,...,ai-1,x,ai,ai+1,...,an ) 。
顺序表上完成这一运算则通过以下步骤进行:
①将ai~an 顺序向下移动,为新元素让出位置;(注意数据的移动方向:从后往前依次后移一个元素)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论