【计算机类职业资格】软件设计师-数据结构及算法设计(一)及答案解析.doc
《【计算机类职业资格】软件设计师-数据结构及算法设计(一)及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】软件设计师-数据结构及算法设计(一)及答案解析.doc(16页珍藏版)》请在麦多课文档分享上搜索。
1、软件设计师-数据结构及算法设计(一)及答案解析(总分:180.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明 5-1】B 树是一种多叉平衡查找树。一棵 m 阶的 B 树,或为空树,或为满足下列特性的 m 叉树:树中每个节点至多有 m 棵子树;若根节点不是叶子节点,则它至少有两棵子树;除根之外的所有非叶子节点至少有m/2棵子树;所有的非叶子节点中包含下列数据信息(n,A 0,K 1,A 1,K 2,A 2,K n,A n),其中:Ki(i=1,2,n)为关键字,且 KiK i+1(i=1,2,n-1),A i(i=0,1,n)为指向子树根节点的指针,且指针
2、 Ai-1所指子树中所有节点的关键字均小于 Ki,A i+1所指子树中所有节点的关键字均大于 Ki,n为节点中关键字的数目;所有的叶子节点都出现在同一层次上,并且不带信息(可以看成是外部节点或查找失败的节点,实际上这些节点不存在,指向这些节点的指针为空)。例如,一棵 4 阶 B 树如图 5-1 所示(节点中关键字的数目省略)。B 树的阶 M、bool 类型、关键字类型及 B 树节点的定义如下:#define M 4 /*B 树的阶*/typedef enumFALSE=0,TRUE=1bool;typedef int ElemKeyType;typedef struct BTreeNodein
3、t numkeys; /*节点中关键字的数目*/struct BTreeNode *parent; /*指向父节点的指针,树根的父节点指针为空*/struct BTreeNode *AM; /*指向子树节点的指针数组*/ElemKeyType KM; /*存储关键字的数组,K0闲置不用*/BTreeNode;函数 SearchBtree(BTreeNode* root,ElemKeyType akey,BTreeNode *ptr)的功能是:在给定的一棵 M阶 B 树中查找关键字 akey 所在节点,若找到则返回 TRUE,否则返回 FALSE。其中, root 是指向该 M 阶B 树根节点的
4、指针,参数 ptr 返回 akey 所在节点的指针,若 akey 不在该 B 树中,则 ptr 返回查找失败时空指针所在节点的指针。例如,在如图 5-1 所示的 4 阶 B 树中查找关键字 25 时,ptr 返回指向节点 e 的指针。注:在节点中查找关键字 akey 时采用二分法。【函数 5-1】bool SearchBtree(BTreeNode* root, ElemKeyType akey, BTreeNode *ptr)int lw,hi,mid;BTreeNode *p=root;*pb=NULL;while(p)lw=1;hi=U (1) /U;while(lw=hi)mid=(l
5、w+hi)/2;if(p-Kmid=akey)*Ptr=p;return TRUE;else if(U (2) /U)hi=mid-1;elselw=mid+1;*ptr=p;p=U (3) /U;return FALSE;【说明 5-2】在 M 阶 B 树中插入一个关键字时,首先在最接近外部节点的某个非叶子节点中增加一个关键字,若该节点中关键字的个数不超过 M-1,则完成插入;否则,要进行节点的“分裂”处理。所谓“分裂”,就是把节点中处于中间位置上的关键字取出来并插入其父节点中,然后以该关键字为分界线,把原节点分成两个节点。“分裂”过程可能会一直持续到树根,若树根节点也需要分裂,则整棵树的高
6、度增 1。例如,在如图 5-1 所示的 B 树中插入关键字 25 时,需将其插入节点 e 中,由于 e 中已经有 3 个关键字,因此将关键字 24 插入节点 e 的父节点 b,并以 24 为分界线将节点 e 分裂为 e1 和 e2 两个节点,结果如图5-2 所示。(分数:15.00)_二、B试题二/B(总题数:1,分数:15.00)2.【说明】 散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放 m 个记录,当桶中已有 m 个同义词(散列函数值相同)的记录时,存放第 m+1 个同义词会发生“溢出”。此时需要将第 m+1 个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前 m 个
7、同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。 例如:设散列函数为 Hash(Key)=Key mod 7,记录的关键字序列为 15,14,21,87,96, 293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图 5-3 所示。 (分数:15.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 函数 int Toplogcal(LinkedWDigraph G)的功能是对图 G 中的顶点进行拓扑
8、排序,并返回关键路径的长度。其中图 G 表示一个具有 n 个顶点的 AOE 网,图中顶点从 1n 依次编号,图 G 的存储结构采用邻接表表示,其数据类型定义如下: typedef struct Gnode /*邻接表的表节点类型*/ int adjvex; /*邻接顶点编号*/ int weieht; /*弧上的权值*/ stract Gnode *nextarc; /*指示下一个弧的节点*/ Gnode; typedef struct Adjlist /*邻接表的头节点类型*/ char vdata; /*顶点的数据信息*/ struct Gnode *Firstadj; /*指向邻接表的第
9、一个表节点*/ Adjlist; typedef struct LinkedWDigraph /*图的类型*/ int n,e; /*图中顶点个数和边数*/ struct Adjlist *head; /*指向图中第一个顶点的邻接表的头节点*/ LinkedWDigraph; 例如,某 AOE 网如图 5-4 所示,其邻接表存储结构如图 5-5 所示。 (分数:15.00)_四、B试题四/B(总题数:1,分数:15.00)4.【说明】 函数 DeleteNode(Bitree*r,inte)的功能是:在树根节点指针为 r 的二叉查找(排序)树上删除键值为 e 的节点,若删除成功,则函数返回 0
10、,否则函数返回-1。二叉查找树节点的类型定义为: typedef struct Tnode int data;/*节点的键值*/ struct Tnode *Lchild,*Rchiid;/*指向左、右子树的指针*/ *Bitree; 在二叉查找树上删除一个节点时,要考虑 3 种情况。 若待删除的节点 p 是叶子节点,则直接删除该节点。 若待删除的节点 p 只有一个子节点,则将这个子节点与待删除节点的父节点直接连接,然后删除节点。 若待删除的节点 p 有两个子节点,则在其左子树上,用中序遍历寻找关键值最大的节点 s,用节点 s 的值代替节点 p 的值,然后删除节点 s,节点 s 必属于上述、情
11、况之一。 【函数 5-5】 int DeleteNode(Bitree *r,int e) Bitree p=*r,pp,s,c; while(U (1) /U/*从树根节点出发查找键值为 e 的节点*/ pp=p; if(ep-data)p=p-Lchild; else p=p-Rehild; if(!p)retrn -1;/*查找失败*/ if(p-Lchild pp=p; while(U (3) /U)pp=s;s=s-Rchild; p-data=s-data;p=s; /* 处理情况、*/ if(U (4) /U)c=p-Lchild; else c=p-Rchild; if(p=
12、*r)*r=c; else if(U (5) /U)pp-Lchild=c; else pp-Rchild=c; free(p); return 0; (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.【预备知识】 对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合a,b,c,d及其权值 2、7、4、5,可构造如图 5-6 所示的最优二叉树和相应的结构数组 Ht(数组元素 Ht0不用)。 (分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】 设 M 叉树采用列表法表示,即每棵子树对应一
13、个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表 a(b(c,d),e,f(g,h,i)表示。 (分数:15.00)_七、B试题七/B(总题数:1,分数:15.00)7.【说明】 设某城市有 n 个车站,并有 m 条公交线路连接这些车站,设这些公交车都是单向的,这 n 个车站被顺序编号为 0 至 n-1。输入该城市的公交线路数、车站个数,以及各公交线路上的各站编号,求得从站 0 出发乘公交车至站 n-1 的最少换车次数。 程序利用输入信息构建一张有向图 G(用邻接矩阵 g 表示),有向图
14、的顶点是车站,若有某条公交线路经 i 站能到达 j 站,就在顶点 i 到顶点 j 之间设置一条权为 1 的有向边i,j。如是这样,从站点 x 至站点 y 的最少上车次数便对应图 G 中从点 x 至点 y 的最短路径长度。而程序要求的换车次数就是上车次数减 1。 【函数 5-9】 #include stdio.h #define M 20 #define N 50 int aN+1; /*用于存放一条线路上的各站编号*/ iht gNN; /*存储对应的邻接矩阵*/ int distN; /*存储站 0 到各站的最短路径*/ int m,n; void buildG() int i,j,k,sc
15、,dd; printf (“输入公交线路数,公交站数/n“); scanf(“%d%d“, for(i=0; in; i+) /*邻接矩阵清 0*/ for(j = 0; j n; j+)gij = 0; for(i=0; im; i+) printf(“沿第%d 条公交车线路前进方向的各站编号(O=编号=%d,-1 结束):/n“, i+1, n-1); sc=0;/* 当前线路站计数器 */ while(1) scanf(“%d“, if(dd=-1)break; if(dd=0 asc=-1; for(k=1;ak=0; k+) /* 处理第 i+1 条公交线路 */ for(j=0;
16、jk; j+) gU (2) /U=1; int minLen() int j, k; for(j=0;jn;j+)distj=g0j; dist0=1; do for(k=-1,j=0;jn;j+) /* 找下一个最少上车次数的站*/ if(distj0 if (k0 | k=n-1) break; distk=-distk; /* 设置 k 站已求得上车次数的标记 */ for(j=1;jn;j+) /* 调整经过 k 站能到达的其余各站的上车次数 */ if (U (3) /U while(1); j=distn-1; return U(5) /U; void main() int t;
17、 buildG(); if(t=minLen()0)printf(“无解!/n“);else pdnff(“从 0 号站到%d 站需换车%d 次/n”,n-1,t); (分数:15.00)_八、B试题八/B(总题数:1,分数:15.00)8.【说明】 假设需要将 N 个任务分配给 N 个工人同时去完成,每个人都能承担这 N 个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配 1 个不同的任务。程序中,N 个任务从 0 开始依次编号,N 个工人也从。开始依次编号,主要的变量说明如下。 cij:将任务 i 分配给工人 j 的费用。 taski:值为 0
18、 表示任务 i 未分配,值为 j 表示任务 i 分配给工人j。 workerk:值为 0 表示工人 k 未分配任务,值为 1 表示工人 k 已分配任务。 mincost:最小总费用。 【C 程序】 #includestdio.h #define N 8 /*N 表示任务数和工人数*/ int cNN; unsigned int mincost=65535; /*设置的初始值,大于可能的费用*/ int taskN, tempN, workerN; void plan(int k, unsigned int cost) int i; if(U (1) /U for(i=0; iN; i+)tem
19、pi=taski; else for(i=0; iN;i+)/*分配任务 k*/ if(workeri=0 taskk=U (3) /U; plan(U (4) /U,cost+cki); U(5) /U; taskk=0; /*if*/ /*Plan*/ void main() int i,j; for(i=0; iN; i+) /*设置每个任务由不同工人承担时的费用及全局数组的初值*/ workeri=0; taski=0; tempi=0; for(j=0; jN; j+) scanf(%d“, plan(0,0);/*从任务 0 开始分配*/ printf(“/n 最小差用=%d/n“
20、, mincost); for(i=0;iN;i+) printf(“Task%d is assigned to Worker%d/n“,i,tempi); /*main*/(分数:15.00)_九、B试题九/B(总题数:2,分数:15.00)9.【问题 1】 请将【算法 5-1】和【算法 5-2】中(1)至(7)处补充完整。(分数:7.00)_10.【问题 2】 请从下面的选项中选择相应的判断逻辑填补【算法 5-2】中的“判断条件 1”至“判断条件 3”。注意,若“判断条件 2”的逻辑判断结果为假,就无须对“判断条件 3”进行判断。 (a) 字符是括号 (b) 字符是左括号 (c) 字符是右
21、括号 (d) 栈空 (e) 栈不空 (f) 栈顶元素表示的是与当前字符匹配的左括号 (g) 栈顶元素表示的是与当前字符匹配的右括号(分数:8.00)_十、B试题十/B(总题数:1,分数:15.00)11.【说明】 “背包问题”的基本描述是:有一个背包,能盛放的物品总重量为 S,设有 N 件物品,其重量分别为 w1,w2,wn。希望从 N 件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于 S。 如下程序均能求得“背包问题”的一组解,其中程序 1 是“背包问题”的递归解法,而程序 2 是“背包问题”的非递归解法。 【程序 1】 #includestdio.h #d
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 软件 设计师 数据结构 算法 设计 答案 解析 DOC
