首页 > 计算机等级考试
题目内容 (请给出正确答案)
[主观题]

试说明如何对最长公共前缀数组lcp做适当预处理,使得最长公共扩展查询在最坏情况下需要O(1)时间.

查看答案
答案
收藏
如果结果不匹配,请 联系老师 获取答案
您可能会需要:
您的账号:,可能还需要:
您的账号:
发送账号密码至手机
发送
安装优题宝APP,拍照搜题省时又省心!
更多“试说明如何对最长公共前缀数组lcp做适当预处理,使得最长公共…”相关的问题
第1题
阅读以下说明和C++ 程序,将应填入(n)处的字句写在对应栏内。 [说明] 试从含有n个int 型数的数组中

阅读以下说明和C++ 程序,将应填入(n)处的字句写在对应栏内。

[说明]

试从含有n个int 型数的数组中删去若干个成分,使剩下的全部成分构成一个不减的子序列。设计算法和编写程序求出数组的不减子序列的长。

[C++ 程序]

include<stdio.h>

define N 100

int b[]={9,8,5,4,3,2,7,6,8,7,5,3,4,5,9,1};

int a [N];

define n sizeofb/sizeofb[0]

void main ()

{

kit k,i,j;

(1)

(2)

for (i=1;i<n; i++ )

{

for (j=k;(3); j--);

(4); /*长为 j+1 的子序列的终元素存储在 a[j+1]*/

if ((5)k++; /*最长不减子序列长 k 增1*/

}

printf ("K = %d\n ",k );

}

点击查看答案
第2题
阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 【预备

阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

【预备知识】

①对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图3所示的最优二叉树和相应的结构数组Ht(数组元素Ht[0]不用)(见表5)。

图3最优二叉树

表5 结构数组Ht

结构数组Ht的类型定义如下:

define MAXLEAFNUM 20

struct node{

char ch;/*当前结点表示的字符,对于非叶子结点,此域不用*/

int weight;/*当前结点的权值*/

int parent;/*当前结点的父结点的下标,为0时表示无父结点*/

int lchild,rchild;

/*当前结点的左、右孩子结点的下标,为0时表示无对应的孩子结点*/

}Ht[2*MAXLEAFNUM];

②用′0′或′1′标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用′0′(′1′)标识该分支(示例如图3所示)。

③若用上述规则标识最优二叉树的每条分支后,从根结点开始到叶子结点为止,按经过分支的次序,将相应标识依次排列,可得到由′0′、′1′组成的一个序列,称此序列为该叶子结点的前缀编码。例如图3所示的叶子结点a、b、c、d的前缀编码分别是110、0、111、10。

【函数5.1说明】

函数void LeafCode(int root,int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中形参root为最优二叉树的根结点下标;形参n为叶子结点个数。

在构造过程中 ,将Ht[p].weight域用作被遍历结点的遍历状态标志。

【函数5.1】

char**Hc;

void LeafCode(int root,int n)

{/*为最优二叉树中的n个叶子结点构造前缀编码,root是树的根结点下标*/

int i,p=root,cdlen=0;char code[20];

Hc=(char**)malloc((n+1)*sizeof(char*));/*申请字符指针数组*/

for(i=1;i<=p;++i)

Ht[i].weight=0;/*遍历最优二叉树时用作被遍历结点的状态标志*/

while(p){/*以非递归方法遍历最优二叉树,求树中每个叶子结点的编码*/

if(Ht[p].weight==0){/*向左*/

Ht[p].weight=1;

if (Ht[p].lchild !=0) { p=Ht[p].lchild; code[cdlen++]=′0′;}

else if (Ht[p].rchild==0) {/*若是叶子结 点,则保存其前缀编码*/

Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));

(1) ;strcpy(He[p],code);

}

}

else if (Ht[p].weight==1){/*向右*/

Ht[p].weight=2;

if(Ht[p].rchild !=0){p=Ht[p].rchild;code[cdlen++]=′1′;}

}

else{/*Ht[p].weight==2,回退*/

Ht[p].weight=0;

p= (2) ; (3) ;/*退回父结点*/

}

}/*while结束*/

}

【函数5.2说明】

函数void Decode(char*buff,int root)的功能是:将前缀编码序列翻译成叶子结点的字符序列并输出。其中形参root为最优二叉树的根结点下标;形参buff指向前缀编码序列。

【函数5.2】

void Decode(char*buff,int root)

{ int pre=root,p;

while(*buff!=′\0′){

p=root;

while(p!=0){/*存在下标为p的结点*/

pre=p;

if((4) )p=Ht[p].lchild;/*进入左子树*/

else p=Ht[p].rchild;/*进入右子树*/

buff++;/*指向前缀编码序列的下一个字符*/

(5) ;

printf(″%c″,Ht[pre].ch);

}

}

点击查看答案
第3题
阅读以下说明和流程图,回答问题将解答填入对应栏内。[说明] 已知递推数列:a(1)=1,a (2s)= a (s),a

阅读以下说明和流程图,回答问题将解答填入对应栏内。

[说明]

已知递推数列:a(1)=1,a (2s)= a (s),a(2s+1)=a (s)+a (s+1)(s 为正整数)。试求该数列的第n项与前n项中哪些项最大?最大值为多少?

算法分析:该数列序号分为奇数或偶数两种情况做不同递推,所得数列呈大小有规律的摆动。设置a数组,赋初值a (1)=1。根据递推式,在循环中分项序号s (2~n)为奇数或偶数作不同递推:每得一项 a (s),即与最大值max 作比较,如果a (s)>max,则max=a(i)。最后,在所有项中搜索最大项(因最大项可能多于一项),并打印最大值max。

[问题]

将流程图中的(1)~(5)处补充完整。

注:流程图中(1)循环开始的说明按照“循环变量名:循环初值,循环终值,增量”格式描述。

[流程图]

点击查看答案
第4题
下列与队列结构有关联的是

A.函数的递归调用

B.数组元素的引用

C.多重循环的执行

D.先到先服务的作业调度

点击查看答案
第5题
●试题五 阅读以下程序说明和C程序,将应填入(n)处的子句,写在答卷纸的对应栏内。 【程序说明】 函

●试题五

阅读以下程序说明和C程序,将应填入(n)处的子句,写在答卷纸的对应栏内。

【程序说明】

函数int commstr(char *str1,char *str2,int *sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。

函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。

【程序】

int strlen(char *s)

{char *t=s;

while(*++);

return t-s-1;

}

intcommstr(char)*str1,char *str2,int *sublen

{char*s1,*s2;

int count=0,len1,len2,k,j,i,p;

len1=strlen(str1);

len2=strlen(str2);

if(len1>len2)

{s1=str1;s2=str2;}

else{len2=len1;s1=str2;s2=str1;}

for(j=len2;j>0;j--)/*从可能最长子串开始寻找*

{for(k=0; (1) <=len2;k++)/*k为子串s2的开始位置*/

{for(i=0;s1[ (2) ]!='\0';i++;)/* i为子串s1的开始位置*/

{/* s1的子串与s2的子串比较*/

for(p=0;p<j)&& (3) ;p++);

if ((4) )/*如果两子串相同*/

{for(p=0);p<j;p++}/*输出子串*/

printf("%c",s2[k+p]);

printf("\n");

count++;/* 计数增1*/

}

}

}

if (count>0)break;

*sublen=(count>0)? (5) :0;

return count;

}

点击查看答案
第6题
试题四(共15分)阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。【说明】已知两

试题四(共15分)

阅读以下说明和C函数,填充函数中的空缺,将解答填入答题纸的对应栏内。

【说明】

已知两个整数数组A和B中分别存放了长度为m和n的两个非递减有序序列,函数Adjustment(A,B,m,n)的功能是合并两个非递减序列,并将序列的前m个整数存入A中,其余元素依序存入B中。

合并过程如下:从数组A的第一个元素开始处理。用数组B的最小元素B[0]与数组A的当前元素比较,若A的元素较小,则继续考查A的下一个元素;否则,先将A的最大元素暂存入temp,然后移动A中的元素挪出空闲单元并将B[0]插入数组A,最后将暂存在temp中的数据插入数组B的适当位置(保持B的有序性)。如此重复,直到A中所有元素都不大于B中所有元素为止。

【C函数】

void Adjustment(int A[],int B[],int m,int n)

{ /*数组A有m个元素,数组B有n个元素*/

inti,k,temp;

for(i=0;i<m;i++)

{

if(A[i]<=B[0]) continue,

temp= (1) ;/*将A中的最大元素备份至temp*/

/*从后往前依次考查A的元素,移动A的元素并将来自B的最小元素插入A中*/

for(k= m-1; (2) ;k--)

A[k]=A[k-1];

A[i]=(3) ;

/*将备份在temp的数据插入数组B的适当位置*/

for(k=1; (4) &&k<n;k++)

B[k_1]=B[k];

B[k-1]= (5) ;

}

}

点击查看答案
第7题
阅读下列算法说明和流程图,根据要求回答问题1~问题3。 [说明] 某机器上需要处理n个作业job1,job2,

阅读下列算法说明和流程图,根据要求回答问题1~问题3。

[说明]

某机器上需要处理n个作业job1,job2,…,jobn,其中:

(1)每个作业jobi(1≤i≤n)的编号为i,jobi有一个收益值P[i]和最后期限值d[i];

(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;

(3)job1~jobn的收益值呈非递增顺序排列,即p[1]≥p[2]≥…≥p[n];

(4)如果作业jobi在其期限之内完成,则获得收益p[i];如果在其期限之后完成,则没有收益。

为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图3-25是基于贪心策略求解该问题的流程图。

(1)整型数组J[]有n个存储单元,变量k表示在期限之内完成的作业数,J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k)里的作业按其最后期限非递减排序,即d[J[1]]≤…≤d[J[k]]。

(2)为了便于在数组J中加入作业,增加一个虚拟作业job0,并令d[0]=0,J[0]=0。

(3)算法大致思想是:先将作业job1的编号1放入J[1],然后,依次对每个作业jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。

jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。

(4)流程图中的主要变量说明如下。

i:循环控制变量,表示作业的编号;

k:表示在期限内完成的作业数;

r:若jobi能插入数组J,则其在数组J中的位置为r+1;

q:循环控制变量,用于移动数组J中的元素。

请将图3-25中的(1)~(3)空缺处的内容填写完整。

点击查看答案
第8题
软件产品生产周期长、耗资巨大,必须特别注意保证质量,而通常保证软件质量的措施可归为四方面,即复
审、复查、管理复审和测试,不同的方面反映了软件质量保证措施中的不同需要,试回答以下问题并适当加以阐述:

1、复审、复查、管理复审和测试各自包括的具体内容是什么,它在哪些方面对软件质量的保证产生了作用?

2、软件复审和软件测试之间有什么联系,又有什么差别?各自有什么侧重?

3、软件测试的目的是什么,对其具体的内容和实现过程做—扼要陈述,无需对测试方法做出介绍.

点击查看答案
第9题
关于无分类编址CIDR,下列说法错误的是()。

A.CIDR将网络前缀都相同的连续的IP地址组成“CIDR”地址块。

B.网络前缀越短,其地址块所包含的地址数就越少。

C.CIDR使用各种长度的“网络前缀”来代替分类地址中的网络号和子网号。

D.使用CIDR,查找路由表时可能会得到多个匹配结果,应当从匹配结果中选择具有最长网络前缀的路由。因为网络前缀越长,路由就越具体。

点击查看答案
第10题
●试题六 阅读以下说明和Java代码,将解答写入答题纸的对应栏内。【说明】 下面程序的功能是显示已

●试题六

阅读以下说明和Java代码,将解答写入答题纸的对应栏内。【说明】

下面程序的功能是显示已定义的一个3行3列的二维数组每行的元素,并求所有元素的和并输出。请在程序的每条横线处填写一个适当的语句,使程序的功能完整。

public class Array{

(1) static (2) main(String args[])

{

int sum=0;

int b[][]={{11,12,13},{21,22,23},{31,32,33}};

for(int i=0; (3) i++)

{

System.out.print("b["+i+"]: ");

for(int j=0; (4) j++)

{

System.out.print(b[i][j]+" ");

(5)

}

System.out.println();

}

System.out.println("sum="+sum);

}

}

点击查看答案
第11题
为了区分重载多态中同名的不同方法,要求______。A.形式参数个数或者类型不同B.返回值类型不同C.形

为了区分重载多态中同名的不同方法,要求______。

A.形式参数个数或者类型不同

B.返回值类型不同

C.形式参数名称不同

D.调用时用类名或对象名做前缀

点击查看答案
退出 登录/注册
发送账号至手机
密码将被重置
获取验证码
发送
温馨提示
该问题答案仅针对搜题卡用户开放,请点击购买搜题卡。
马上购买搜题卡
我已购买搜题卡, 登录账号 继续查看答案
重置密码
确认修改