信息管理与信息系统专业数据结构期末考试复习资料.docx
《信息管理与信息系统专业数据结构期末考试复习资料.docx》由会员分享,可在线阅读,更多相关《信息管理与信息系统专业数据结构期末考试复习资料.docx(19页珍藏版)》请在冰豆网上搜索。
信息管理与信息系统专业数据结构期末考试复习资料
第一章
1.数据:
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号总称。
2.数据类型:
一个值的集合和定义在这个值集上的一组操作的总称
数据元素之间的关系有4类基本结构
(1)集合
(2)线性结构(3)树形结构(4)网状结构或图状结构。
抽象数据类型:
指一个数学模型以及定义在该模型上的操作
3.数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科
4.数据的逻辑结构、存储结构
数据的逻辑结构:
只抽象反映数据元素的逻辑关系
数据的存储(物理)结构:
数据的逻辑结构在计算机存储器中的实现(顺序存储结构、链式存储结构)
5.
算法的特性
6.算法设计的要求
(1)正确性(correctness):
算法应满足具体问题的需求
1、不含语法错误
2、对于几组输入数据能够得出满足规格说明要求的结果
(2)可读性(readability):
人的阅读与交流
(3)健壮性(robustness):
当输入非法数据时,算法能够适当的做出反应或进行处理,不会产生莫名其妙的结果
(4)效率与低存储量:
算法的执行时间和所需的最大存储空间
7.时间复杂度
随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。
简称时间复杂度。
——即基本操作(原操作)重复执行的次数的阶数
T(n)=o(f(n))
第二章
1.线性表的基本概念与特点
概念:
一个线性表是n个数据元素的有限序列
线性结构的特点:
在数据元素的非空有限集中
(1)存在唯一的一个被称作“第一个”的数据元素
(2)存在唯一的一个被称作“最后一个”的数据元素
(3)除第一个外,集合中的每个数据元素均只有一个前驱
(4)除最后一个外,集合中的每个数据元素均只有一个后继
2.顺序表的插入和删除的实现
3.单链表考单链表的插入:
算法2.9
结点中只含一个指针域的链表叫单链表,也叫线性链表
4.判空条件
带头结点的
H→next==Null
不带头结点的
H=Null
5.双向循环链表
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱
6.动态申请内存
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
第三章
1.栈
栈是限定仅在表尾进行插入或删除操作的线性表。
表尾端称为栈顶,表头端称为栈底。
栈又称先进后出(后进先出)的线性表。
2.顺序栈
栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
3.1节考算法:
push,pop操作实现(书P47)
3.简答:
栈的入栈出栈序列
4.栈的应用:
P55页、考算法3.5(汉诺塔算法)
5.队列
队列是一种先进先出的线性表。
它只允许在表的一端进行插入,而在另一端删除元素。
允许插入的一端叫做队尾,允许删除的一端叫做对头。
6.链队列(实质是单链表)
用链表表示的队列成为链队列。
在头删除,尾端插入。
7.循环队列
存储结构特点?
入队、出队P65:
考出队(即:
删除)的算法
第四章
1.串及相关概念
串:
是由零个或多个字符组成的有限序列。
一般记作s=〃a1a2…an〃(n≥0)其中:
s为串名,用双引号括起来的字符序列是串的值;ai(0≤i≤n)可以是字母、数字或其它字符;双引号为串值的定界符,不是串的一部分;
串中字符的数目n称为串的长度。
零个字符的串称为空串(长度为0)。
串中任意连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
通常称字符在序列中的序号为该字符在串中的位置。
空串——零个字符的串,通常以两个相邻的双引号来表示空串(Nullstring),如:
s=〃〃,它的长度为零;
空格串——仅由一个或多个空格组成的的串,如:
s=〃└┘〃;若串中含有空格,在计算串长时,空格应计入串的长度中,如:
s=〃I’mastudent〃的长度为13。
只有两个串的长度相等,并且各个对应位置的字串都相等时才相等。
2.定长顺序存储
实现:
用一组地址连续的存储单元存储串值的字符序列。
串联接和求子串?
考:
定长顺序存储连接时有哪几种情况?
3.匹配模式:
考:
P79算法4.5-81简答next的模式匹配
第五章
1.数组
数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表
考(选择、填空):
图5.1、5.2
2.数组的顺序存储结构?
3.稀疏矩阵
非零元较零元少,且分布没有一定规律的矩阵叫做稀疏矩阵。
4.三元组顺序表
结构:
(顺序存储结构)
转置算法:
将矩阵行、列维数互换
将每个三元组中的i和j相互调换
重排三元组次序,使mb中元素以N的行(M的列)为主序
方法一:
按M的列序转置
即按mb中三元组次序依次在ma中找到相应的三元组进行转置。
为找到M中每一列所有非零元素,需对其三元组表ma从第一行
起扫描一遍。
由于ma中以M行序为主序,所以由此得到的恰是mb
中应有的顺序
方法二:
快速转置
即按ma中三元组次序转置,转置结果放入b中恰当位置
此法关键是要预先确定M中每一列第一个非零元在mb中位置,
为确定这些位置,转置前应先求得M的每一列中非零元个数
5.行逻辑链接(问:
怎么存的)
特点:
为了便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。
可在稀疏矩阵的存储结构中增加一个指示“行”信息的辅助数组
6.十字链表:
存储特点;P104图5.6
7.广义表(考:
写出两个表画结构存储结构:
P109图5.95.11)
广义表是线性表的推广。
广义表是递归定义的线型结构,其中,为原子或为子表。
第一个元素为表头,其余元素组成的表称作表尾,n是表的长度
第六章
1.树
树(tree)是n(n>0)个结点的有限集T,其中:
有且仅有一个特定的结点,称为树的根(root)
当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)
特点:
树中至少有一个结点——根
树中各子树是互不相交的集合
树的基本术语
结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支
结点的度(degree)——结点拥有的子树数
叶子(leaf)——度为0的结点
孩子(child)——结点子树的根称为该结点的孩子
双亲(parents)——孩子结点的上层结点叫该结点的~
兄弟(sibling)——同一双亲的孩子
树的度——一棵树中最大的结点度数
结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……
深度(depth)——树中结点的最大层次数
森林(forest)——m(m0)棵互不相交的树的集合
2.二叉树
二叉树是n(n0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成(特点:
任一个结点的度不超过2:
只能为0、1、2)
3.满二叉树
4.完全二叉树
深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为~
5.性质
性质1:
证明:
用归纳法证明之
i=1时,只有一个根结点,是对的
假设对所有j(1j
则可以证明j=I是命题成立。
由归纳法假设,第i-1层至多有 个结点
又二叉树每个结点的度至多为2
第i层上最大结点数是第i-1层的2倍,即
故命题得证
性质2:
深度为k的二叉树至多有个结点(k1)
证明:
由性质1,可得深度为k的二叉树最大结点数是
性质3:
对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
证明:
设n1为二叉树T中度为1的结点数
因为:
二叉树中所有结点的度均小于或等于2
所以:
其结点总数n=n0+n1+n2
又二叉树中,除根结点外,其余结点都只有一个分支进入,设B为分支总数,
则n=B+1
又:
分支由度为1和度为2的结点射出,
B=n1+2n2
于是,n=B+1=n1+2n2+1=n0+n1+n2
n0=n2+1
性质4:
性质5:
如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1in),有:
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是i/2
(2)如果2i>n,则结点i无左孩子;如果2in,则其左孩子是2i
(3)如果2i+1>n,则结点i无右孩子;如果2i+1n,则其右孩子是2i+1
6.顺序存储
实现:
按满二叉树的结点层次编号,依次存放二叉树中的数据元素
特点:
(1)结点间关系蕴含在其存储位置中
(2)浪费空间,适于存满二叉树和完全二叉树
二叉树→存储结构
7.链式存储
二叉链表?
三叉链表?
双亲链表?
8.遍历二叉树与二叉树的转换
先序遍历:
先访问根结点,然后分别先序遍历左子树、右子树
中序遍历:
先中序遍历左子树,然后访问根结点,最后中序遍历右子树
后序遍历:
先后序遍历左、右子树,然后访问根结点
按层次遍历:
从上到下、从左到右访问各结点
9.树和森林
树的存储结构
双亲表示法
实现:
定义结构数组存放树的结点,每个结点含两个域:
数据域:
存放结点本身信息
双亲域:
指示本结点的双亲结点在数组中位置
特点:
找双亲容易,找孩子难
孩子表示法
多重链表:
每个结点有多个指针域,分别指向其子树的根
结点同构:
结点的指针个数相等,为树的度D
结点不同构:
结点指针个数不等,为该结点的度d
孩子兄弟表示法(二叉链表表示法)
链表中结点的两个链域分别指向该结点的第一个孩子和下一个兄弟结点
10.树与二叉树的转换
将树转换成二叉树
加线:
在兄弟之间加一连线
抹线:
对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
旋转:
以树的根结点为轴心,将整树顺时针转45°
将二叉树转换成树
加线:
若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子,……沿分支找到的所有右孩子,都与p的双亲用线连起来
抹线:
抹掉原二叉树中双亲与右孩子之间的连线
调整:
将结点按层次排列,形成树结构
森林转换成二叉树
将各棵树分别转换成二叉树
将每棵树的根结点用线相连
以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树型结构
二叉树转换成森林
抹线:
将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
还原:
将孤立的二叉树还原成树
11.树和森林的遍历
先序遍历森林
(1)访问森林中第一棵树的根节点
(2)先序遍历第一棵树中根节点的子树森林
(3)先序遍历除去第一棵树之后剩余的树构成的森林
中序遍历森林
(1)中序遍历森林中第一棵树的根节点的子树森林
(2)访问第一棵树的根节点
(3)中序遍历除去第一棵树之后剩余的树构成的森林
遍历树的方法
一种是先根遍历树:
先访问树的根结点,然后依次先根遍历根的每棵子树;另一种是后根遍历,即:
先依次后根遍历每棵子树,然后访问根结点
12.哈夫曼树(Huffman)——带权路径长度最短的树
定义
路径:
从树中一个结点到另一个结点之间的分支构成这两个结点间的~
路径长度:
路径上的分支数
树的路径长度:
从树根到每一个结点的路径长度之和
树的带权路径长度:
树中所有带权结点的路径长度之和
Huffman树——设有n个权值{w1,w2,……wn},构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则wpl最小的二叉树叫~
13赫夫曼算法
(1)根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令其权值为wj
(2)在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和
(3)在森林中删除这两棵树,同时将新得到的二叉树加入森林中
(4)重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树
14.赫夫曼编码:
P148例题
第七章
1.有向图、无向图、网、子图
图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)
其中:
V(G)是顶点的非空有限集
E(G)是边的有限集合,边是顶点的无序对或有序对
有向图——有向图G是由两个集合V(G)和E(G)组成的
其中:
V(G)是顶点的非空有限集
E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为,v,w是顶点,v为弧尾,w为弧头
无向图——无向图G是由两个集合V(G)和E(G)组成的
其中:
V(G)是顶点的非空有限集
E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v)
网——带权的图叫~
子图——如果图G(V,E)和图G‘(V’,E‘),满足:
∙V’V
∙E’E
则称G‘为G的子图
邻接点——对于无向图G(V,E),如果边(v,v’)E,则称v和v’互为邻接点。
即:
v和v’相邻接。
无向图中,顶点的度为与每个顶点相连的边数
有向图中,顶点的度分成入度与出度
入度:
以该顶点为头的弧的数目
出度:
以该顶点为尾的弧的数目
路径——路径是顶点的序列V={Vi0,Vi1,……Vin},满足(Vij-1,Vij)E或E,(1路径长度——沿路径边的数目或沿路径各边权值之和
简单路径——序列中顶点不重复出现的路径叫~
简单回路/简单环——除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫~
连通图——图中任意两个顶点都是连通的叫~
连通分量——非连通图的每一个连通部分叫~
强连通图——有向图中,如果对每一对(Vi,Vj)V,ViVj,从Vi到Vj和从Vj到Vi都存在路径,则称G是~
强连通分量——有向图中的极大强连通子图叫~
生成树——一个连通图的生成树是一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的n-1条边
2.图的存储结构特点
数组表示法(邻接矩阵)(有、无都可)
(1)无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2
(2)有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n²
(3)无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和
有向图中,
∙顶点Vi的出度是A中第i行元素之和
∙顶点Vi的入度是A中第i列元素之和
(4)网络的邻接矩阵可定义为:
邻接表(有、无都可)
(1)无向图中顶点Vi的度为第i个单链表中的结点数
(2)有向图中
∙顶点Vi的出度为第i个单链表中的结点个数
∙顶点Vi的入度为整个单链表中邻接点域值是i的结点个数
(3)逆邻接表:
有向图中对每个结点建立以Vi为头的弧的单链表
十字链表(有向图)
是有向图的另一种链式存储结构
邻接多重表(无向图)
是无向图的另一种链式存储结构
3.图的遍历
深度优先遍历(DFS)
方法:
从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止
广度优先遍历(BFS)
方法:
从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止
4.最小生成树
对于n个顶点的联通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网,选择一棵生成树,使总的耗费最少。
普里姆(Prim)算法
算法思想:
设N=(V,{E})是连通网,TE是N上最小生成树中边的集合
∙初始令U={u0},(u0V),TE=
∙在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0)
∙将(u0,v0)并入集合TE,同时v0并入U
∙重复上述操作直至U=V为止,则T=(V,{TE})为N的最小生成树
克鲁斯卡尔(Kruskal)算法
算法思想:
设连通网N=(V,{E}),令最小生成树
∙初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量
∙在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边
依此类推,直至T中所有顶点都在同一连通分量上为止
第九章
1.顺序查找特点?
对查找概率不等的查找表,先对查找概率进行排序
优点:
算法简单,适用面广
缺点:
平均查找长度较大。
查找过程:
从表的一端开始逐个进行记录的关键字和给定值的比较
2.折半查找特点?
查找过程:
每次将待查记录所在区间缩小一半
适用条件:
采用顺序存储结构的有序表
3.哈希表
哈希表的函数构造
直接定址法
构造:
取关键字或关键字的某个线性函数作哈希地址,即H(key)=key或H(key)=a·key+b
除留余数法
构造:
取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(key)=keyMODp,pm
4.处理冲突的方法
开放定址法
方法:
当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放到该地址中,即Hi=(H(key)+di)MODm,i=1,2,……k(km-1)
其中:
H(key)——哈希函数
m——哈希表表长
di——增量序列
分类
线性探测再散列:
di=1,2,3,……m-1
二次探测再散列:
di=1²,-1²,2²,-2²,3²,……±k²(km/2)
例表长为11的哈希表中已填有关键字为17,60,29的记录,
H(key)=keyMOD11,现有第4个记录,其关键字为38,
按三种处理冲突的方法,将它填入表中
(1)H(38)=38MOD11=5冲突
H1=(5+1)MOD11=6冲突
H2=(5+2)MOD11=7冲突
H3=(5+3)MOD11=8不冲突
(2)H(38)=38MOD11=5冲突
H1=(5+1²)MOD11=6冲突
H2=(5-1²)MOD11=4不冲突
(3)H(38)=38MOD11=5冲突
设伪随机数序列为9,则:
H1=(5+9)MOD11=3不冲突
链地址法
方法:
将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针
例已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79)
哈希函数为:
H(key)=keyMOD13,
用链地址法处理冲突
5.使用指定的哈希函数和处理冲突的方法构造哈希表
第十章
1.直接插入排序算法?
排序过程:
整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序
时间复杂度
若待排序记录按关键字从小到大排列(正序)
关键字比较次数:
记录移动次数:
若待排序记录按关键字从大到小排列(逆序)
关键字比较次数:
记录移动次数:
若待排序记录是随机的,取平均值
关键字比较次数:
记录移动次数:
空间复杂度:
S(n)=O
(1)
2.折半插入排序算法?
排序过程:
用折半查找方法确定插入位置的排序叫~
算法评价
时间复杂度:
T(n)=O(n²)
空间复杂度:
S(n)=O
(1)
3.希尔排序算法?
基本思想:
分割成若干个较小的子文件,对各个子文件分别进行直接插入排序,当文件达到基本有序时,再对整个文件进行一次直接插入排序。
2依据:
⑴若待排序文件"基本有序",即文件中具有特性:
r[i].key<Max{r[j].key}1≤j<i的记录数较少,则文件中大多数记录都不需要进行插入。
⑵基本有序时,直接插入排序效率可以提高,接近于O(n)。
3排序过程:
先取一个正整数d14.起泡排序算法?
排序过程
(1)将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上
(2)对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置
(3)重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止
时间复杂度
最好情况(正序)
比较次数:
n-1
移动次数:
0
最坏情况(逆序)
比较次数:
移动次数:
T(n)=O(n²)
空间复杂度:
S(n)=O
(1)
5.快速排序算法?
基本思想:
通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序
排序过程:
(1)对r[s……t]中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=r[s],x=rp.key
(2)初始时令i=s,j=t
(3)首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换
(4)再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换
(5)重复上述两步,直至i==j为止
(6)再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止
算法评价
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)
最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)
空间复杂度:
需栈空间以实现递归
最坏情况:
S(n)=O(n)
一般情况:
S(n)=O(log2n)
6.简单选择排序算法?
排序过程
(1)首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
(2)再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
(3)重复上述操作,共进行n-1趟排序后,排序结束
算法评价
时间复杂度
记录移动次数
最好情况:
0
最坏情况:
3(n-1)
比较次数:
T(n)=O(n²)
空间复杂度:
S(n)=O
(1)