2017年南京航空航天大学541计算机综合基础之数据结构(C)语言版考研复试核心题库
● 摘要
一、应用题
1. 一个长度为的升序序列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)说明算法的复杂性:算法的时间复杂度、空间复杂度分别是
2. 请回答下列关于堆(Heap )的一些问题:
(1)堆的存储表示是顺序的还是链接的?
(2)设有一个最小堆,即堆中任意结点的关键码均不大于它的左子女和右子女的关键码。其具有最大值的元素可能在什么地方?
(3)对n 个元素进行初始建堆的过程中,最多做多少次数据比较(不用大0表示法)?
【答案】(1)堆的存储是顺序的。
(2)最大值元素一定是叶结点,在最下两层上。
(3)在建含有n 个元素、深度为h 的堆时,其比较次数不超过4n ,推导如下:
由于第i 层上的结点数至多是以它为根的二叉树的深度为则调用次筛选算法时总共进行的关键字比较次数不超过下式之值:
3. 为什么文件的倒排表比多重表组织方式节省空间?
【答案】倒排表有两项,一是次关键字值,二是具有相同次关键字值的物理记录号,这些记录号有序且顺序存储,不使用多重表中的指针链接,因而节省了空间。
4. 假定有下列,矩阵(n 为奇数)
如果用一维数组B 按行主次序存储A 的非零元素,问:
(1)A 中非零元素的行下标与列下标的关系;
(2)给出A 中非零元素的下标
位在B 中的位置公式。
【答案】(1)主对角线上元素的坐标是i=j,副对角线上元素的坐标i 和j 有
所以A 中非零元素的行下标和列下标的关系是或 的关系,与B 中的下标R 的关系; 给出利用的下标定(3)假定矩阵中每个元素占一个存储单元且B 的起始地址为(2)非零元素分布在两条主、副对角线上,除对角线相交处一个元素(下称“中心元素”)外,其余每行都有两个元素。主对角线上的元素,在向量B 中存储的下标
是
副对角线上的元素,在中心元素前,在向量B
中存储的下标是
在中心元素后,其下标如下:
(3)在B 中的位置如下:
5. 对于后序线索二叉树,怎样査找任意结点的直接后继? 对于中序线索二叉树,怎样査找任意结点的直接前驱?
【答案】(1)后序线索树中结点的后继的方法如下:根结点无后继:当结点的rtag=1时,其右线索指向后继;当结点的rtag=0且是其双亲的右孩子,或是双亲的左孩于且双亲无右孩时,其双亲是该结点的后继;当结点是其双亲的左孩子且双亲有右孩子时,其双亲结点右子树种最左下的叶结点是其后继。
(2)对中序线索二叉树的某结点,若其左标记等于1,则左孩子为线索,指向直接前驱;否则其前驱是其左子树上按中序遍历的最后一个结点。
6. 对于具有n 个叶结点且所有非叶结点都有左、右孩子的二叉树。
(1)试问这种二叉树的结点总数是多少?