2017年北京科技大学547软件综合之数据结构复试仿真模拟三套题
● 摘要
一、应用题
1. 画出对算术表达式
表所示。
表 操作数栈和运算符找的变化过程
求值时操作数栈和运算符栈的变化过程。 求值,过程如【答案】设操作数栈是opnd ,运算符栈是optr ,对算术表达式
2. 给出模式串在KMP 算法中的next 和nextval 数组。
【答案】模式串的next 函数定义如下:
根据此定义,
可求解模式串的next 和nextval 值如下:
3. 一个长度为的升序序列S , 处在第「L/2」个位置的数为S 的中位数。例如,若序列Sl= (11,13, 15, 17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2= (2, 4, 6, 8, 20), 则S1和S2的中位数是11。现有两个等长升序序列A 和B ,试设计一个时间和空间两方面都尽可能高效的算法,找出两个序列A 和B 的中位数。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C 或C++或JA V A 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
【答案】(1)算法的基本设计思想:分别求两个升序序列A 和B 的中位数,设为a 和b 。 ① 若a=b,则a 或b 即为所求的中位数。
② 否则,若a
所在序列B 的较大一半。若a>b,中位数只能出现(b ,a )范围内,舍弃b 所在序列B 的较小一半,同时舍弃a 所在序列A 的较大一半。
③在保留的两个升序序列中求出新的中位数a 和b ,重复上述过程,直到两个序列中只含一个元素时为止,则较小者即为所求的中位数。
(2)用C 语言算法描述如下:
//分别考虑奇数和偶数,保持两个子数组元素个数相等
//若元素个数为奇数个
//舍弃A 中间点以前部分且保留中间点
//舍弃B 中间点以后部分且保留中间点
}
//若元素个数为偶数个
//舍弃A 中间点及中间点以前部分
//舍弃B 中间点以后部分且保留中间点
//若元素个数为奇数个
//舍弃A 中间点以后部分且保留中间点
//舍弃B 中间点以前部分且保留中间点
//若元素个数为偶数个
//舍弃A 中间点以后部分且保留中间点
//舍弃B 中间点及中间点以前的部分
(3)说明算法的复杂性:算法的时间复杂度、空间复杂度分别是
4. 为什么在倒排文件组织中,实际记录中的关键字域可删除以节约空间? 而在多重表结构中这样做为什么要牺牲性能?
【答案】因倒排文件组织中,倒排表有关键字值及同一关键字值的记录的所有物理记录号,可方便地查询具有同一关键字值的所有记录;而多重表文件中次关键字索引结构不同,删除关键字域后查询性能受到影响。
5. 假定对有序表:(3,4,5,7,24,30,42,54,63,72,87,95)进行折半查找,试回答下列问题:
(1)画出描述折半查找过程的判定树;
(2)若查找元素54,需依次与哪些元素比较?
(3)若查找元素90,需依次与哪些元素比较?
(4)假定每个元素的查找概率相等,求查找成功时的平均查找长度。
【答案】(1)判定树如图所示:
图 判定树
(2)若查找元素54,需依次和元素30、63、42、54比较,查找成功。
(3)若查找元素90,需依次和元素30、63、87、95比较,查找失败。
(4)