大数据结构第3次Word文件下载.docx
- 文档编号:22084656
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:19.60KB
大数据结构第3次Word文件下载.docx
《大数据结构第3次Word文件下载.docx》由会员分享,可在线阅读,更多相关《大数据结构第3次Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
请设计一个算法,计算矩阵M的转置矩阵N,要求转置算法的时间复杂度为O(n+t)。
三、简答题(本大题共20分,共4小题,每小题5分)
假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}.
(1)为这8个字母设计哈夫曼编码。
(2)若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编码的平均码长是等长编码的百分之几?
它使电文总长平均压缩多少?
若二叉树中各结点的值均不相同,则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。
(1)已知一棵二叉树的前序序列和中序序列分别为ABDGHCEFI和GDHBAECIF,请画出此二叉树。
(2)已知一棵二叉树的在序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出此二叉树。
(3)已知一棵二叉树的前序序列和后序序列分别为AB和BA,请画出这两棵不同的二叉树。
3.
试举一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。
给定集合{15,3,14,2,6,9,16,17}
(1)(3分)用□表示外部结点,用○表示内部结点,构造相应的huffman树:
(2)(2分)计算它的带权路径长度:
(3)(2分)写出它的huffman编码:
(4)(3分)huffman编码常用来译码,请用语言叙述写出其译码的过程。
四、程序设计题(本大题共30分,共2小题,每小题15分)
以二叉链表为存储结构,写出求二叉树叶子总数的算法
设线性表的n个结点定义为(a0,a1,...an-1),重写顺序表上实现的插入算法:
InsertList
答案:
一、填空题(30分,共10题,每小题3分)
参考答案:
栈顶,栈底
解题方案:
评分标准:
根结点,左子树,右子树
普里姆(prim)算法和克鲁斯卡尔(Kruskal)算法
行号、列号、元素值
免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。
(1)活动
(2)活动间的优先关系(3)事件(4)活动边上的权代表活动持续时间
q=p->
next;
p->
next=q->
free(q);
n1+n2=0+n2=n0-1=31,26-1=32
DGEBFCA
开放地址法、再哈希法、链地址法、建立一个公共溢出区
二、算法设计题(20分,共2题,每小题10分)
将单链表A中的所有偶数序号的结点删除,并在删除时把这些结点链接起来构成单链表B。
算法如下:
#include<
stdio.h>
malloc.h>
typedefintElemType;
typedefstructLNode
{
ElemTypedata;
//数据域
structLNode*next;
//指针域
}LNode,*LinkList;
voiddivide(LinkList&
pa,LinkList&
pb)
{pb=(LNode*)malloc(sizeof(LNode*));
pb->
next=NULL;
r=pb;
p=pa->
while(p!
=NULL&
&
next!
=NULL)
{
q=p->
if(q!
r->
next=q;
r=q;
p=p->
}
}
转置可按转置矩阵的三元组表中的元素顺序进行,即按稀疏矩阵的列序。
这种方法时间复杂度是O(n*t),当t和m*n同量级时,时间复杂度为O(n3)。
另一种转置方法称作快速转置,使时间复杂度降为O(m*n)。
需要求出每列非零元素个数和每列第一个非零元素在转置矩阵三元组表中的位置,因此设置了两个附加向量。
下面分别给出两个算法。
TSMatrixTransMatrix(TSMatrixM,TSMatrixN)
{∥采用三元组表方式存储,按列序实现矩阵的转置
N.m=M.n;
N.n=M.m;
N.len=M.len;
∥行数、列数和非零元素个数
if(N.len){q=l;
∥设置N中第一个非零元素从下标1开始存储
for(j=1;
j<=M.n;
j++)∥按列,共M.n列
for(p=1;
p<=M.len;
++p)∥在M.len个元素中查找
if(M.data[p].col==j)∥转置
{N.data[q].row=M.data[p].col;
N.data[q].col=M.data[p].row;
N.data[q].e=M.data[p].e;
q++;
}
returnN;
}∥TransMatrix
TSMatrixFastTransMatrix(TSMatrixM,TSMatrixN)
{∥三元组表上实现矩阵的快速转置的算法
if(M.len)
{for(j=1;
j<
=M.n;
j++)numb[j]=0;
∥矩阵M每一列非零元初始化为零
for(t=1;
t<
=M.len;
t++)numb[M.data[t].col]++;
∥求矩阵M每一列得非零元个数
pos[1]=1;
∥第1列第一个非零元在转置后的三元组中下标是1
for(j=2;
j++)∥求M.data第j列第一个非零元在N.data中的序号
pos[col]=pos[col-1]+num[col-1];
for(p=1;
p<
p++)∥求转置矩阵N的三元组表
{j=M.data[p].col;
q=pos[j];
N.data[q].row=M.data[p].col;
N.data[q].col=M.data[p].row;
pos[j]++;
∥同列下一非零元素位置
}
三、简答题(20分,共4题,每小题5分)
(1)哈夫曼编码
[P_47E42CBBE4BEF0B3804EEA501687A04A]
根据上图可得编码表:
a:
1001
b:
01
c:
10111
d:
1010
e:
11
f:
10110
g:
00
h:
1000
(2)用三位二进行数进行的等长编码平均长度为3,而根据哈夫曼树编码的平均码长为:
4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61
2.61/3=0.87=87%其平均码长是等长码的87%,所以平均压缩率为13%。
(1)已知二叉树的前序序列为ABDGHCEFI和中序序列GDHBAECIF,则可以根据前序序列找到根结点为A,由此,通过中序序列可知它的两棵子树包分别含有GDHB和ECIF结点,又由前序序列可知B和C分别为两棵子树的根结点...以此类推可画出所有结点:
○A
/\
○B○C
//\
○D○E○F
/\/
○G○H○I
(2)以同样的方法可画出该二叉树:
○B○F
\\
○C○G
/\\
○D○E○H
(3)这两棵不同的二叉树为:
○A○A
○B○B
例如有一张学生体检情况登记表,记录了一个班的学生的身高、体重等各项体检信息。
这张登记表中,每个学生的各项体检信息排在一行上。
这个表就是一个数据结构。
每个记录(有姓名,学号,身高和体重等字段)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继(它的前面和后面均有且只有一个记录)。
这几个关系就确定了这个表的逻辑结构是线性结构。
这个表中的数据如何存储到计算机里,并且如何表示数据元素之间的关系呢?
即用一片连续的内存单元来存放这些记录(如用数组表示)还是随机存放各结点数据再用指针进行链接呢?
这就是存储结构的问题。
在这个表的某种存储结构基础上,可实现对这张表中的记录进行查询,修改,删除等操作。
对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。
(1)
[P_F438585CD9EAD09DED967D20E23446F3]
(2)wpl=(2+3)*5+6*4+(9+14+15)*3+(16+17)*2=229
(3)编码为:
15:
111,3:
10101,14:
110,2:
10100,6:
1011,9:
100,16:
00,17:
(4)常用哈夫曼树为通讯用的字符编码,本题中集合的数值解释为字符发生的频率(次数)。
由哈夫曼树构造出哈夫曼编码。
译码时,进行编码的“匹配”,即从左往右扫描对方发来的“编码串”,用字符编码去匹配,得到原来的元素(本题中的数)。
四、程序设计题(30分,共2题,每小题15分)
typedefcharDataType;
//定义DataType类型
typedefstructnode
{
DataTypedata;
structnode*lchild,*rchild;
//左右孩子子树
}BinTNode;
//结点类型
typedefBinTNode*BinTree;
//二叉树类型
intLeaf(BinTreeT)
{//算叶子数
if(T)
if(T->
lchild==NULL)&
(T->
rchild==NULL)
return1;
else
returnLeaf(T->
lchild)+Node(T->
rchild);
else
return0;
#defineListSize100//假定表空间大小为100
typedefintDataType;
//假定DataType的类型为int型
typedefstruct{
DataTypedata[ListSize];
//向量data用于存放表结点
intlength;
//当前的表长度
}Seqlist;
//以上为定义表结构
voidInsertList(Seqlist*L,Datatypex,inti)
//将新结点x插入L所指的顺序表的第i个结点ai的位置上,即插入的合法位置为:
0<
=i<
=L->
length
intj;
if(i<
0||i>
L->
length)
Error("
positionerror"
);
//非法位置,退出,该函数定义见教材P7.
if(L->
length>
=ListSize)
Error(“overflow"
for(j=L->
length-1;
j>
=i;
j--)
L->
data[j+1]=L->
data[j];
L->
data[i]=x;
length++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构