数据结构-查找篇:
内容:
- 思维导图(基于教材)
- 错题复盘+计算题(基于习题解析)
1.思维导图
2.错题复盘+计算题
1 对n个元素的表进行顺序查找时,若查找每个元素的概率相同,则平均查找长度为(C)
A.(n-1)/2 B.n/2 C.(n+1)/2 D.n
解析:书上结论
2 折半查找有序表{4,6,10,12,20,30,50,70,88,100}。若查找表中元素58,则它将依次与表中(A)比较大小,查找结果是失败
A.20,70,30,50 B.30,88,70,50 C.20,50 D.30,88,50
解析:有序表中一共有10个元素,使用折半查找时,第一个位置=向下取整(1+10)/2=5,即待查找元素与第5个元素比较大小,如果待查找元素比第5个元素大,那么下限=5+1,反之上限=5-1,上下限均指向同一个位置时,查找失败。58>20,所以下一个要比较的位置=向下取整(6+10)/2=8,58<70,所以下一个要比较的位置=向下取整(6+7)/2=6,58>30,所以下一个要比较的位置=向下取整(7+7)/2=7,58!=50,所以查找失败
3 对22个记录的有序表进行折半查找,当查找失败时,至少需要比较(B)次关键字
A.3 B.4 C.5 D.6
解析:折半查找判定树深度为向下取整[log2 22]+1=5,且不是满二叉树,所以查找失败时最多比较5次,最少比较4次
4 设散列表长为14,散列函数是H(key)=key%11,表中已有数据的关键字为15、38、61、84,现要将关键字为49的元素存储到表中,用二次探测法解决冲突,则放入的位置是()
A.8 B.3 C.5 D.9
解析:首先,把已有数据的关键字位置算出来:15%11=4,38%11=5,61%11=6,84%11=7然后再算49的位置:49%11=5,冲突了,题目说要用二次探测法,那么49%11+1^2=6
还是冲突,49%11-1^2=4
还是冲突,49%11+2^2=9
没冲突,所以49放入的位置就是9了
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
关键字 | 15 | 38 | 61 | 84 | 49 | |||||||||
比较次数 | 1 | 1 | 1 | 1 | 4 |
5 采用线性探测法处理冲突,可能探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字(A)
A.不一定都是同义词 B.一定都是同义词 C.一定都不是同义词 D.都相同
解析:所探测的关键字可能是在处理其他关键字冲突过程中放入该位置的,因此不一定都是同义词
6 设集合中有n(n>1)个元素,分别存放在两个表中,表A按元素关键字从小到大存放,表B则无序存放。假设每个元素的查找概率相等,若对表A按有序表的顺序查找算法进行查找,对表B按一般表的顺序查找算法从表的前端进行顺序查找,则查找成功时,对于两个表的平均查找长度来说,(C)
A.表A大于表B B.表A小于表B C.相同 D.无法确定
解析:对于顺序查找而言,不论线性表中的元素是否有序,在每个元素的查找概率都相同的情况下,查找成功是的平均查找长度都是相等的,均为(n+1)/2
7 从19个元素中查找其中任意一个元素,如果最多进行4次元素之间的比较,则采用的查找方法只可能是(C)
A.折半查找 B.分块查找 C.散列查找 D.二叉排序树
解析:折半查找在查找成功时关键字的比较次数最多是向下取整[log2n]+1,大于4次;分块查找的查找效率在折半查找和顺序查找之间,但远不及折半查找,所以关键字的比较次数最多的情况下一定大于4次;二叉排序树理想情况下的高度是向上取整[log2 n+1],关键字的比较次数最多为树的高度,大于4次
8 已知一个长度为16的顺序表L,其元素按关键字有序排列,若采用折半查找法查找一个不存在的元素,则比较次数最多的是(B)
A.4 B.5 C.6 D.7
解析:具有n个结点的判定树的高度为向下取整[log2n]+1,所以最多比较5次
9 现有长度为7初始为空的散列表HT,散列函数H(k)=k%7,用线性探测法解决冲突。将关键字22,43,15依次插入到HT后,查找成功的平均查找长度是(C)
A. 1.5 B. 1.6 C. 2 D.3
解析:首先,将关键字插入位置:22%7=1;43%7=1,冲突,由于使用的是线性探测法解决冲突,所以43%7+1=2;15%7=1,冲突,15%7+1=2,还是冲突,15%7+2=3,将下表填写
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
关键字 | 22 | 43 | 15 | ||||
比较次数 | 1 | 2 | 3 |
ASL成功=(1+2+3)/3=2
10 现有长度为11且初始为空的散列表HT,散列函数H(k)=k%7,用线性探测法解决冲突。将关键字87,40,30,6,11,22,98,20依次插入到HT后,查找失败的平均查找长度是(C)
A. 4 B. 5.25 C. 6 D.6.29
解析:跟前面的一样,先画出散列表,再计算ASL
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
关键字 | 98 | 22 | 30 | 87 | 11 | 40 | 6 | 20 | |||
比较次数 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 |
ASL失败=(9+8+7+6+5+4+3)/7=6
11 假定对有序表{3,4,5,7,24,30,42,54,63,72,87,95}进行折半查找,试回答下列问题
- 画出描述折半查找过程的判定树
- 若查找元素54,需依次与哪些元素比较?
- 若查找元素90,需依次与哪些元素比较?
- 假定每个元素的查找概率相等,求查找成功时的平均查找长度
12 设散列表的地址范围为0~17,散列函数为:H(key)=key%16。用线性探测法处理冲突,输入关键字序列:(10,24,32,17,31,30,46,47,40,63,49},构造散列表,试回答下列问题
- 画出散列表的示意图
散列地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
关键字 | 32 | 17 | 63 | 49 | 24 | 40 | 10 | 30 | 31 | 46 | 47 | ||||||
比较次数 | 1 | 1 | 6 | 3 | 1 | 2 | 1 | 1 | 1 | 3 | 3 |
- 查找关键字63,需依次与哪些元素比较?
首先求出H(63)=63%16=15,如表所示,15位存放的是31,又因为用线性探测法处理冲突,所以依次与46、47、32、17、63比较,最终找到63 - 若查找关键字60,需依次与哪些元素比较?
跟上题一样,H(60)=60%16=12,如表所示,12位没存放元素,查找失败 - 假定每个元素的查找概率相等,求查找成功时的平均查找长度
ASL成功=(1+1+6+3+1+2+1+1+1+3+3)/11=23/11≈2.09
13 设一组关键字(9,1,23,14,55,20,84,27),采用散列函数:H(key)=key%7,表长为10,用开放地址法的二次探测法处理冲突。要求:对该关键字序列构造散列表,并计算查找成功的平均查找长度。限定di取值为1^2,2^2,...,k^2(k≤m/2)
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
关键字 | 14 | 1 | 9 | 23 | 84 | 27 | 55 | 20 | ||
比较次数 | 1 | 1 | 1 | 2 | 3 | 4 | 1 | 2 |
ASL成功=(1+1+1+2+3+4+1+2)/8=15/8=1.875
14 设散函数H(K)=3K%11,散列地址空间为0~10,对关键字序列(32,13,49,24,38,21,4,12),按下列两种解决冲突的方法构造散列表,并分别求出等概率下查找成功时和查找失败时的平均查找长度ASLsucc和ASLunsucc
- 线性探测法
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
关键字 | 4 | 12 | 49 | 38 | 13 | 24 | 32 | 21 | |||
比较次数 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 |
ASLsucc=(1+1+1+2+1+2+1+2)/8=11/8=1.375
ASLunsucc=(1+2+1+8+7+6+5+4+3+2+1)/11=40/11≈3.64
- 链地址法
15 将关键字序列{7,8,30,11,18,9,14}散列存储到散列表中,散列表的存储空间是一个下标从0开始的一维数组散列,函数为:H(key)=(key*3) MOD T,处理冲突采用线性探测再散列法,要求装载因子为0.7。请回答下列问题
- 请画出所构造的散列表
因为装填因子要求为0.7,关键字个数有7个,所以表长m=7/0.7=10
函数为:H(key)=(key*3) MOD 7
线性探测再散列法函数为:H(key)=(H(key)+di) MOD 10,(di=1,2,3,…,9)
H(7)=(7*3)%7=0
H(8)=(7*3)%7=3
H(30)=(7*3)%7=6
H(11)=(11*3)%7=5
H(18)=(18*3)%7=5
,5号位已存11,发生冲突,需要采用线性探测再散列法解决冲突,所以H(18)=(5+1) MOD 10=6
,6号位已存30,发生冲突,再采用线性探测再散列法解决冲突,H(18)=(5+2) MOD 10=7
,7号位空,存入,比较了3次
H(9)=(9*3)%7=6
,冲突,所以H(9)=(6+1)%10=7
,冲突,H(9)=(6+2)%10=8
,不冲突
H(14)=(14*3)%7=0
,冲突,所以H(14)=(0+1)%10=0
,不冲突
所以最终散列表如下表所示
散列地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
关键字 | 7 | 14 | 8 | 11 | 30 | 18 | 9 | |||
比较次数 | 1 | 2 | 1 | 1 | 1 | 3 | 3 |
- 分别计算等概率下查找成功时和查找失败时的平均查找长度
ASLsucc=(1+2+1+1+1+1+3+3)/7=12/7≈1.71
ASLunsucc=(3+2+1+2+15+4)/7=18/7≈2.57