第8章 查找 习题参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题八参考答案
一、选择题
1.对线性表进行二分查找时,要求线性表必须( B )
A.以顺序方式存储 B、以顺序方式存储,且结点按关键字值有序排列
C、以链接方式存储D.以链接方式存储,且结点按关键字值有序排列
2、用二分查找法查找具有n个结点得顺序表时,查找每个结点得平均比较次数就是( D ) A。O(n2) B.O(nlog2n) C。O(n) D.O(log2n)
3、对长度为4得顺序表进行查找,若查找第一个记录得概率为1/24, 查找第二个记录得概率为1/6, 查找第三个记录得概率为2/3, 查找第四个记录得概率为1/8,则查找任意一个记录得平均查找长度为( A )
A。23/8 B、20/8 C.17/8 D.14/8
4。若有一个长度为64得有序表,现用二分查找方法查找某一记录,则查找不成功,最多需要比较( B )次、
A、9 B.7 C.5 D。3
5。当采用分块查找时,数据得组织方式为( C )
A、数据必须有序
B、数据不必有序
C、数据分成若干块,每块内数据不必有序,但块间必须有序
D。数据分成若干块,每块内数据必须有序,但块间不必有序
6、一棵深度为k得平衡二叉树,其每个非终端结点得平衡因子均为0,则该平衡二叉树共有( C )个结点、
A.2k—1-1 B。2k-1+1 C、2k-1 D、2k+1
7. 具有5层结点得平衡二叉树至少有( B )个结点。
A、10 B。12 C.15 D.17
8、若结点得存储地址与其关键字之间存在某种映射关系,则称这种存储结构为( D)
A、顺序存储结构B。链式存储结构 C。索引存储结构 D.散列存储结构
9。以下有关m阶B-树得叙述中,错误得就是( B )。
A。根结点至多有m棵子树B。每个结点至少有棵子树
C、所有叶子结点都在同一层上 D、每个结点至多有m-1个关键字
10.哈希表得地址区间为0~17,哈希函数为h(key)=K%17。采用线性探测法处理冲突,并将关键字序列{26,25,72,38,8,18,59}依次存储到哈希表中,则在哈希表中查找元素59需要搜索得次数为( C )。
A、2 B.3 C。4 D.5
二、填空题
1.动态查找表与静态查找表得主要区别在于动态查找表有插入与删除操作。
2.假定待查找记录个数为n,则在等概率得情况下,顺序查找在查找成功情况下得平均查找长度为 (n+1)/2 ;在查找失败情况下得平均查找长度为 n+1 。
3. 对线性表进行二分查找时,要求线性表必须以顺序方式存储,且数据有序。
4。分块查找分为两个阶段,分别就是确定待查元素所在得块与在块内查找待查得元素。
5。哈希法存储中,冲突指得就是不同关键字值对应到相同得存储地址、
6。一棵二叉排序树用中序遍历输出得信息就是递增序列、
7.深度为4得平衡二叉树中至少有7个结点,至多有15 个结点。
8.引入B-树得根本原因就是减少查找一个元素需要访问得外存得次数。
9。哈希法存储得基本思想就是根据关键字来决定存储地址、
10.设计一个好得哈希函数,其函数值应该以同等概率取其值域得每个值。
三、算法设计题
1.基于SeqList类,设计带监视哨得顺序查找算法,要求把监视哨设置在n号单元、
参考答案:
public int seqSearchWithGuard(Comparable key) {
int i = length() — 1;
getRecord()[i]、setKey(key); //哨兵设置在第n号单元
i = 0;
while ((getRecord()[i]、getKey())。pareTo(key) != 0) {
i++;
}
if (i 〈length() - 1) {
return i;
} else {
return -1;
}
}
2.基于SeqList类,设计一个递归算法,实现二分查找。
参考答案:
public int binarySearchRecursively(intlow, int high, Comparablekey) {
int mid, result;
if(low〈= high) {
mid = (low + high) / 2; //中间位置,当前比较元素位置
result = getRecord()[mid]、getKey()、pareTo(key);
if (result 〉 0) {
return binarySearchRecursively(low, mid — 1, key); //查找成功
} else if (result 〈0) {
return binarySearchRecursively(mid + 1, high, k ey);
}else {
return mid;
}
}
return—1; //查找不成功
}
3。基于BSTree类,设计一个算法,判断所给得二叉树就是否为二叉排序树。
参考答案:
public class Exercise8_3_3 extends BSTree {
booleanflag= true;
Comparable lastkey= new KeyType(0);
//判断二叉树T就是否二叉排序树,就是则返回true,否则返回false
boolean Is_BSTree(BiTreeNode T) {
if (T、getLchild() != null && flag) {
Is_BSTree(T、getLchild());
}
if (lastkey。pareTo(((RecordNode) T。getData())。getKey()) 〉0) {
flag = false; //与其中序前驱相比较
}
((KeyType) lastkey)、setKey(((KeyType) (((RecordNode) T、get Data())。getKey()))。getKey());
if (T.getRchild() != null &&flag) {
Is_BSTree(T。getRchild());
}
return flag;
}
}
4.基于BSTree类,设计一个算法,输出给定二叉排序树中值最大得结点。
参考答案:
BiTreeNode maxNode(BiTreeNode T) {
if(T == null) {
System、out。println(”这就是一颗空树.”);
return null;
} else {
BiTreeNode q = T;
while (q.getRchild() != null) {
q = q、getRchild();
}
return q;
}
}
5。基于BSTree类,设计一个算法,求出指定结点在给定得二叉排序树中所在得层数。
参考答案:
public class Exercise8_3_5 extends BSTree{
static int level = 0; //层数
static boolean found = false;
public staticint levelOfNode(BiTreeNodep, Comparable key) {
if (p !=null &&!found) {
level++;
if(key.pareTo(((RecordNode) p。getData())、getKey()) == 0) {
found = true;
;