作业8解答.docx
- 文档编号:4744455
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:8
- 大小:78.21KB
作业8解答.docx
《作业8解答.docx》由会员分享,可在线阅读,更多相关《作业8解答.docx(8页珍藏版)》请在冰豆网上搜索。
作业8解答
作业8解答
查找与索引技术
作业8
单项选择题
1.ISAM文件和VASM文件属于( )。
(北方名校经典试题)
A)索引非顺序文件B)索引顺序文件C)顺序文件D)散列文件
【分析】ISAM为索引顺序存取存取方法(indexedSequentialAccessMethod)的缩写,是一种索引顺序文件。
VSAM为虚拟存取方法(VirtualStorageAccessMethod)的缩写,此方法利用了操作系统的虚拟存储器的功能,但实质也是一种索引顺序文件。
【答案:
B】
2.用ISAM组织文件适合于( )。
(北方名校经典试题)
A)磁带B)磁盘C)磁鼓
的是( )。
A)顺序查找B)折半查找C)分块查找D)二叉排序树查找
【分析】顺序查找的平均时间复杂度为O(n2),分块查找的平均时间复杂度为O((n/s+1)/2+1)或O(log2(n/s+1)+s/2),都比折半查找平均时间复杂度O(log2n)大,虽然二叉排序树查找时在随机情况下的时间复杂度也为O(log2n),但是折半查找在最坏情况下的时间复杂度为O(log2n),而当二叉排序树查找为单支树时,查找时与顺序查找相同,时间复杂度为O(n2),所以本题应选择B。
【答案:
B】
5.在关键字随机分布的情况下,用二叉排序树的方法进行查找,其查找长度与( )量级相当。
(东部名校经典试题)
A)顺序查找B)折半查找C)分块查找D)前面都不正确
【分析】在随机的情况下,二叉排序树的平均查找长度的数据量级为O(log2n),与折半查找同数量级。
【答案:
B】
6.采用分块查找时,如某线性表中共有256个元素,查找每个元素的概率相同,假设采用顺序查找来确定元素所在的块,则每块包含( )个结点时,平均查找长度最小。
(东部名校经典试题)
A)256B)15C)16D)18
【分析】对于分块查找方法设长度为n的表均匀地分成b块,每块含有s个元素,用顺序查找确定所在的块时平均查找长度为
,当s=
=16时,
取最小值
+1=17。
【答案:
C】
二、综合题
1.已知关键字序列{23,13,5,28,14,25},试构造二叉排序树。
(东部名校经典试题)
【解答】构造二叉排序树的过程如下图所示。
图 构造二叉排序树的过程示意图
构造的二叉排序树如下图所示:
图 二叉排序树示意图
2.已知一组关键字为(19,14,23,1,68,20,84,27,55,11,10,79),哈希函数:
H(key)=keyMOD13,哈希地址空间为0~12,请构造用链地址法处理冲突的哈希表,并求平均查找长度。
(东部名校经典试题)
【解答】哈希表如下图所示:
图 哈希表示意图
平均查找长度为ASL=
(1*6+2*4+3*1+4*1)=1.75
3.已知哈希表地址空间是0..8,哈希函数是H(k)=k%7,采用线性探测再散列处理冲突,将序列{100,20,21,35,3,78,99,45}数据序依次存入此哈希表中,列出插入时的比较次数,并求出在等概率下的平均查找长度。
(东部名校经典试题)
【解答】哈希表及查找各关键字的比较次数如下表所示:
哈西表及查找各关键字的比较次数
哈希地址
0
1
2
3
4
5
6
7
8
关键字
21
35
100
3
78
99
20
45
比较次数
1
2
1
1
4
5
1
5
平均查找长度=
4.已知关键字序列{12,26,38,89,56},试构造平衡二叉树。
【解答】
在构造平衡二叉树时,与构造二叉排序树类似,也是从空二叉树开始,用二叉排序树的方法依次插入结点,如出现不平衡时,作适当的旋转操作使用变成平衡二叉树即可,本题构造过程如下图7-32所示:
图 构造平衡二叉树的过程示意图
如下图所示:
图 平衡二叉树示意图
5.编写判定给定的二叉树是否是二叉排序树的函数。
(南方名校经典试题)
注:
此题选做。
【解答】判定二叉树是否为二叉排序树同样是建立在中序遍历的框架基础下,在遍历中附设一指针pre指向当前访问结点的中序直接前驱,每访问一个结点便比较前驱结点pre和此结点是否有序,若遍历结束后各结点和其中序直接前驱均满足有序,则此二叉树为二叉排序树;否则只要有一个结点不满足,那么此二叉树就不是二叉排序树。
C++语言版测试程序见8_2_5c++,具体算当如下:
template
boolIsBST(Binary_node
//判断二叉树sub_root是否为二叉排序树,pre为当前被遍历结点的前驱,初值为空
{
if(sub_root)
{
if(IsBST
returnfalse;//如左子树不为二叉排序树,则返回false
if(pre)
{
if(pre->data>sub_root->data)
returnfalse;//如果pre与当前结点无序,则返回false
}
pre=sub_root;
if(IsBST
returnfalse;//如左子树不为二叉排序树,则返回false
}
returntrue;
}
template
boolIsBST(constBinary_tree
//判断二叉树T是否为二叉排序树
{
returnIsBST(T.get_root());
}
C语言版测试程序见8_2_5c,具体算当如下:
StatusIsBST(BiTreeT,BiTNode*pre=NULL)
//判断二叉树T是否为二叉排序树,pre为当前被遍历结点的前驱,初值为空
{
if(T)
{
if(IsBST(T->lchild,pre)==FALSE)
returnFALSE;//如左子树不为二叉排序树,则返回FALSE
if(pre)
{
if(pre->data.key>=T->data.key)
returnFALSE;//如果pre与当前结点无序,则返回FALSE
}
pre=T;
if(IsBST(T->rchild,pre)==FALSE)
returnFALSE;//如左子树不为二叉排序树,则返回FALSE
}
returnTRUE;
}
6.试编写一用链地址法解决冲突解决冲突的哈希表插入函数。
(东部名校经典试题)
注:
此题选做。
【解答】对此哈希表的插入,首先通过哈希函数确定此关键字要插入的链表,然后在此链表中插入此关键字。
C++语言版测试程序见8_2_6c++,具体算当如下:
template
intHash(KeyK)
//哈希函数
{
returnK%CHAINNUM;
}
template
voidInsertHash(LList
//使用链地址法解决冲突的哈希表的插入
{
inti=Hash
//将p插入到链表HT[i]的首部
cout< "< "< HT[i]->append(e); } C语言版测试程序见8_2_6c,具体算当如下: intHash(KeyTypeK) //哈希函数 { returnK%CHAINNUM; } voidInsertHash(ChainHash&HT,HElemTypee) //使用链地址法解决冲突的哈希表的插入 { inti=Hash(e.key);//i为在K所对应的链表 ChainNode*p=newChainNode;//生成所插入的结点 //将p插入到链表HT[i]的首部 cout< "< "< p->data=e;p->next=HT[i];HT[i]=p; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)