当前位置:问答库>考研试题

2018年兰州理工大学计算机与通信学院408计算机学科专业基础综合[专业硕士]之数据结构考研基础五套测试题

  摘要

一、算法设计题

1. 以顺序存储结构表示串,设计算法。求串S 中出现的第一个最长重复子串及其位置并分析算法的时间复杂度。

【答案】算法如下:

//串用一维数组s 存储,本算法求最长重复子串,返回其长度

//index记最长的串在s 串中的开始位置,max

记其长度

//length记局部重复子串长度,i 为字符数组下标

//上一个重复子串结束

//当前重复子串长

度大,则更新

max

//初始化下一重复子串的起始位置和长度

(”最长重复子串的长度为

.//算法结束

,在串中的位置

,max ,index) ;

时间复杂度:算法的时间复杂度为O(n),每个字符与其后继比较一次。

2. 假设串的存储结构如下所示,编写算法实现串的置换操作。

【答案】算法如下:

//s和t 是用一维数组存储的串,本算法将s 串第i 个字符开始连续j 个字符用t 串置换,操作成功返回1,否则返回0表示失败

//检査参数及置换后的长度的合法性

//若S 串被替换的子串长度小于t 串长度,则S 串部分右移

//S串中被替换子串的长度小于t 串的长度

//将t 串复制到S 串的适当位置

//算法结束

//本算法是串的置换操作,将串S 中所有非空串t 相等且不重叠的子串用V 代替

//判断S 是否有和t 相等的子串

//串S 中包含和t 相等的子串

//creat操作是将串常量(此处为空串) 赋值给

temp

//求串t 和s 的长度

//用串v 替换t 形成部

分结果

//将串s 中串后的部分形成新的s 串

//求串s 的长度

//在新s 串中再找串t 的位置

//将串temp 和剩余的串s 连接后再赋值给s

}//if结束

//算法结束

3. 编程:假设以数组Q[m]存放循环队列中的元素,同时以rear 和length 分别指示环形队列中的队尾位置和队列中所含元素的个数。试给出该循环队列的队空条件和队满条件,并写出相应的初始化(initqueue),插入(enqueue)和删除(dequeue)元素的操作。

【答案】定义队列:

//循环队列占m 个存储单元

//rear指向队尾元素,length 为元素个数

(1)设cq 是seQueue 类型变量,则当(2)队列的初始化:

//cq为循环队列,本算法进行队列初始化

时队列空,当 时队列满。

//算法结束 (3)队列的插入:

//cq是已如上定义的循环队列,本算法将元素x 入队

//队满

.

//计算插入元素位置

//将元素x 入队列

//修改队列长度

//算法结束

//cq是已如上定义的循环队列,本算法是出队算法,且返回出队元素

//队空

;//出队元素位置

//修改队列长度

//返回队头元素

//算法结束

4. 己知L 为链表的头结点地址,表中共有m(m>3) 个结点,从表中第i 个结点(l<i <m) 起到第m 个结点构成一个循环部分链表,设计将这部分循环链表中所有结点顺序完全倒置的算法。

【答案】算法如下:

//L是有m 个结点的链表的头结点的指针。表中从第个结点到第m 个结点构成循环部分链表//本算法将这部分循环链表倒置

//p是工作指针,初始指向第二结点(已假定i >

l) //pre是前驱结点指针,最终指向第i ﹣i 个结点

//计数器

//查找第i 个结点

//査找结束,P 指向第i 个结点

//暂存第i 个结点的指针

//p指向第i +l 个结点,准备逆置

//上面while 循环结束时,j =i ﹣1现从第i +1结点开始逆置

(4)队列的删除: