2018年北京市培养单位遥感与数字地球研究所862计算机学科综合(非专业)之数据结构考研强化五套模拟题
● 摘要
一、算法设计题
1. 试编写在带头结点的单链表中删除(一个) 最小值结点的(高效) 算法。delete(Linklist&L)
【答案】算法如下:
//L是带头结点的单链表,本算法删除其最小值结点
//P为工作指针。指向恃处理的结点。假定链表非空
//pre指向最小值结点的前驱
//q指向最小值结点,初始假定第一元素结点是最小值结点
//查最小值结点
//指针后移
//从链表上刪除最小值结点
//释放最小值结点空间
//结束算法Delete
2. 设给定关键字输入序列为(100,90,120,60,78,35,42,31,15) 用哈希法散列0-10的地址区间。要求设计一合理的哈希函数;冲突时用链表法解决,写出哈希算法,并构造出哈希表,在等概率查找情况下查找成功的平均查找长度是多少?
【答案】算法如下:
关键字
链指针
用链地址法解决冲突,构造哈希表,哈希函数用
初始化
输入n(本例中n=9)
个关键字按题意x 互不相同
第 2 页,共 42 页
4等插入结点链入同义词表
构造的哈希表如图所示:
图构造的哈希表
查找成功时的平均查找长度
。
3. 以顺序存储结构表示串,设计算法。求串S 中出现的第一个最长重复子串及其位置并分析算法的时间复杂度。
【答案】算法如下:
//串用一维数组s 存储,本算法求最长重复子串,返回其长度
//index记最长的串在s 串中的开始位置,max
记其长度
//length记局部重复子串长度,i 为字符数组下标
//上一个重复子串结束
//当前重复子串长
度大,则更新
max
//初始化下一重复子串的起始位置和长度
(”最长重复子串的长度为
.//算法结束
第 3 页,共 42 页
,在串中的位置,max ,index) ;
时间复杂度:算法的时间复杂度为O(n),每个字符与其后继比较一次。
4. 有二叉排序树采用二叉链表方式存放,树中结点值各不相同,欲得到一个由大到小的结点值递减序列,简述处理方法思路,用非递归形式写出算法。
【答案】算法如下:
按递减次序输出二叉排序树结点的值
是元素为二叉树结点指针的栈,容量足够大
沿右子树向下
结束
5. 设稀疏矩阵中有t 个非零元素,用三元组顺序表的方式存储。请设计一个算法,计算矩阵M 的转置矩阵N ,要求转置算法的时间复杂度为0(n+t) 。
【答案】算法如下:
//采用三元组表方式存储,按列序实现矩阵的转置
//行数、列数和非零元素个数
//设置N 中第一个非零元素从下标1开始存储
//按列,共
//在//转置
//三元组表上实现矩阵的快速转置的算法
//矩阵M 每一列非零元初始化为零
//求矩阵M 每一列的非
零元个数
//第1列第一个非零元在转置后的三元组中下标是
1
//求
第j 列第一个非零元在
中的序号
列
个元素中查找
//求转置矩阵N 的三元组表
第 4 页,共 42 页