数据结构单元9.docx
《数据结构单元9.docx》由会员分享,可在线阅读,更多相关《数据结构单元9.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构单元9
单元9
一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)
(√)
(1)二分查找法要求待查表的关键字值必须有序。
(ㄨ)
(2)对有序表而言采用二分查找总比采用顺序查找法速度快。
(ㄨ)(3)在二叉排序树中,根结点的值都小于孩子结点的值。
(√)(4)散列存储法的基本思想是由关键字的值决定数据的存储地址。
(√)(5)哈希表是一种将关键字转换为存储地址的存储方法。
(ㄨ)(6)选择好的哈希函数就可以避免冲突的发生。
(ㄨ)(7)在有序的顺序表和有序的链表上,均可以采用二分查找来提高查找速度。
(√)(8)采用分块查找,既能实现线性表所希望的查找速度,又能适应动态变化的需要。
(√)(9)哈希法的查找效率主要取决于哈希表构造时选取的哈希函数和处理冲突的方法。
(ㄨ)(10)在二叉排序树上删除一个结点时,不必移动其它结点,只要将该结点的父结点的相应的指针域置空即可。
二.填空题
(1)顺序查找法,表中元素可以任意存放。
(2)在分块查找方法中,首先查找索引,然后再查找相应的块。
(3)顺序查找、二分查找、分块查找都属于静态查找。
(4)静态查找表所含元素个数在查找阶段是固定不变的。
(5)对于长度为n的线性表,若进行顺序查找,则时间复杂度为O(n)。
(6)对于长度为n的线性表,若采用二分查找,则时间复杂度为:
O(log2n)。
(7)理想情况下,在散列表中查找一个元素的时间复杂度为:
O
(1)。
(8)在关键字序列(7,10,12,18,28,36,45,92)中,用二分查找法查找关键字92,要比较4次才找到。
(9)设有100个元素,用二分查找时,最大的比较次数是7次。
(10)对二叉排序树进行查找的方法是用待查的值与根结点的键值进行比较,若比根结点小,则继续在左子树中查找。
(11)二叉排序树是一种动态查找表。
(12)哈希表是按散列存储方式构造的存储结构
(13)哈希法既是一种存储方法,又是一种查找方法。
(14)散列表的查找效率主要取决于散列表造表时选取的散列函数和处理冲突的方法。
(15)设散列函数H和键值k1,k2,若k1≠k2,且H(k1)=H(k2),则称这种现象为冲突。
(16)处理冲突的两类主要方法是开放定址法和拉链法(或链地址法)。
(17)散列表(或散列)查找法的平均查找长度与元素个数n无关。
(18)在哈希函数H(key)=key%P中,P一般应取质数。
(19)在查找过程中有插入元素或删除元素操作的,称为动态查找。
(20)各结点左右子树深度之差的绝对值至多为1的二叉树称谓平衡二叉树。
三.选择题
(1)查找表是以(A)为查找结构。
A.集合B.图C.树D.文件
(2)顺序查找法适合于存储结构为(B)的线性表。
A.散列存储B.顺序存储或链接存储
C.压缩存储D.索引存储
(3)在表长为n的链表中进行线性查找,它的平均查找长度为(B)。
A.ASL=n;B.ASL=(n+1)/2;
C.ASL=
+1;D.ASL≈log2n
(4)对线性表进行二分查找时,要求线性表必须(D)。
A.以顺序方式存储B.以链接方式存储,且结点按关键字有序排序
C.以链接方式存储D.以顺序方式存储,且结点按关键字有序排序
(5)衡量查找算法效率的主要标准是(B)。
A.元素个数B.平均查找长度C.所需的存储量D.算法难易程度
(6)如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用(A)查找方法。
A.分块B.顺序C.二分D.散列
(7)链表适用于(A)查找。
A.顺序B.二分C.随机D.顺序或二分
(8)一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值为82的结点时,(C)次比较后查找成功。
A.2B.3C.4D.5
(9)二分查找有序表{4,6,10,12,20,30,50,70,88,100},若查找表中元素58,则它将依次与表中(B)比较大小,查找结果是失败。
A.30,88,70,50B.20,70,30,50C.20,50D.30,88,50
(10)对有14个元素的有序表A[1..14]作二分查找,查找元素A[4]时的被比较元素依次为(C)。
A.A[1],A[2],A[3],A[4]B.A[1],A[14],A[7],A[4]
C.A[7],A[3],A[5],A[4]D.A[7],A[5],A[3],A[4]
(11)有一个长度为12的有序表,按二分查找法对其进行查找,在表内各元素等概率情况下查找成功所需的平均比较次数为(B)。
A.35/12B.37/12C.39/12D.43/12
(12)采用分块查找时,若线性表共有625个元素,查找每个元素的概率相等,假设采用顺序查找来确定结点所在的块时,每块分(C)个结点最佳。
A.6B.10C.25D.625
(13)下列(C)不是利用查找表中数据元素的关系进行查找的方法。
A.平衡二叉树B.有序表的查找
C.散列查找D.二叉排序树的查找
(14)设哈希表长m=14,哈希函数H(key)=key%11。
表中已有4个结点:
addr(15)=4
addr(38)=5
addr(61)=6
addr(84)=7
其余地址为空。
如用二次探测再散列处理冲突,关键字为49的结点的地址是(D)。
A.8B.3C.5D.9
(15)对包含n个元素的散列表进行查找,平均查找长度为(D)。
A.O(n2)B.O(log2n)C.O(n)D.不直接依赖于n
(16)冲突指的是(C)。
A.两个元素具有相同序号B.两个元素的键值不同
C.不同键值对应相同的存储地址D.两个元素的键值相同
(17)在查找过程中,不做增加、删除或修改的查找称为(A)。
A.静态查找B.内创造C.动态查找D.外查找
(18)已知8个元素为{34,76,45,18,26,54,92,65},按照依次插入结点的方法生成一棵二叉树,最后两层上结点的总数为(B)。
A.1B.2C.3D.4
(19)不可能生成下图二叉排序树的关键字的序列是(A)。
A.45312B.42531C.45213D.42315
(20)动态查找包括(B)查找。
A.顺序表B.二叉排序树
C.有序表D.索引顺序表
四.应用题
1.对于给定结点的关键字集合K={5,7,3,1,9,6,4,8,2,10},
(1)试构造一棵二叉排序树;
(2)求等概率情况下的平均查找长度ASL。
解:
(1)构造二叉排序树:
(2)ASL=(1*1+2*2+3*4+4*3)/10=2.9
2.对于给定结点的关键字集合K={10,18,3,5,19,2,4,9,7,15},
(1)试构造一棵二叉排序树;
(2)求等概率情况下的平均查找长度ASL。
解:
(1)构造二叉排序树:
(2)ASL=(1*1+2*2+3*4+4*2+5*1)/10=3
3.将数据序列:
25,73,62,191,325,138,依次插入下图所示的二叉排序树,并画出最后结果。
解:
4.对于给定结点的关键字集合K={1,12,5,8,3,10,7,13,9},
(1)试构造一棵二叉排序树;
(2)在二叉树排序BT中删除“12”后的树结构:
或
5.对于给定结点的关键字集合K={34,76,45,18,26,54,92,38},
(1)试构造一棵二叉排序树;
(2)求等概率情况下的平均查找长度ASL。
解:
(1)构造二叉排序树
(2)ASL=(1*1+2*2+3*3+4*2)/8=2.75(或=11/4)
6.对于给定结点的关键字集合K={4,8,2,9,1,3,6,7,5},
(1)试构造一棵二叉排序树;
(2)求等概率情况下的平均查找长度ASL。
解:
(1)构造二叉排序树
(2)ASL=(1*1+2*2+3*4+4*2)/9=2.78(或=25/9)
7.画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。
解:
长度为10的判定树:
-------------------------------1次能找到
------------------------2次能找到
------------------3次能找到
-------------4次能找到
ASL=1/10(1*1+2*2+3*4+4*3)=2.9
8.二叉排序树如图所示,分别画出:
(1)画出删除关键字15以后的二叉树,并要求其平均查找长度尽可能小;
(2)在原二叉排序树(即没有删除15)上,插入关键字20。
解:
(1)
(2)
9.给定结点的关键字序列为:
19,14,23,1,68,20,84,27,55,11,10,79。
设散列表的长度为13,散列函数为:
H(K)=K%13。
试画出线性探测再散列解决冲突时所构造的散列表,并求出其平均查找长度。
解:
(1)线性探测再散列解决冲突时所构造的散列表:
0
1
2
3
4
5
6
7
8
9
10
11
12
14
1
68
27
55
19
20
84
79
23
11
10
①②①④③①①③⑨①①③
(2)平均查找长度ASL=(1*6+2*1+3*3+4*1+9*1)/12=30/3=3
10.给定结点的关键字序列为:
47,7,29,11,16,92,22,8,3,哈希表的长度为11。
设散列函数为:
H(K)=K%11。
试画出平方探测再散列解决冲突时所构造的散列表,并求出其平均查找长度。
解:
(1)平方探测再散列解决冲突时所构造的散列表。
0
1
2
3
4
5
6
7
8
9
10
11
22
3
47
92
16
7
29
8
①②②①①①①②②
(2)平均查找长度ASL=(1*5+2*4)/9=13/9=5/3(或1.44)
11.给定结点的关键字序列为:
19,14,23,1,68,20,84,27,55,11,10,79。
设散列表的长度为13,散列函数为:
H(K)=K%13。
试画出链地址法解决冲突时所构造的哈希表,并求出其平均查找长度。
解:
(1)链地址法解决冲突时所构造的哈希表。
0
∧
1
14
1
27
79
∧
2
∧
3
68
55
∧
4
∧
5
∧
6
19
84
∧
7
20
∧
8
∧
9
∧
10
23
10
∧
11
11
∧
12
∧
(2)平均查找长度ASL=(1*6+2*4+3*1+4*1)/12=21/12=7/4(或1.75)
12.给定结点的关键字序列为:
47,7,29,11,16,92,22,8,3,哈希表的长度为11。
设散列函数为:
H(K)=K%11。
试画出链地址法解决冲突时所构造的哈希表,并求出其平均查找长度。
解:
(1)链地址法解决冲突时所构造的哈希表。
0
11
22
∧
1
∧
2
∧
3
47
3
∧
4
92
∧
5
16
∧
6
∧
7
7
29
∧
8
8
∧
9
∧
10
∧
(2)平均查找长度ASL=(1*6+2*3)/9=12/9=4/3(或1.33)
五.算法设计题
1.设单链表的结点是按关键字从小到大排列的,试写出对此链表进行查找的算法。
如果查找成功,则返回指向关键字为x的结点的指针,否则返回NULL。
2.试设计一个在用开放地址法解决从突的散列表上删除一个指定结点的算法。
3.设给定的散列表存储空间为H[1-m],每个单元可存放一个记录,H[i]的初始值为零,选取散列函数为H(R.key),其中key为记录R的关键字,解决冲突的方法为线性控测法,编写一个函数将某记录R填入到散列表H中。
1.解:
实现本题功能的算法如下,如果查找成功,则返回指向关键字为x的结点的指针,否则返回NULL。
node*sqsearch(node*head,intx)
{
node*p=head;
while(p!
=NULL)
{if(x>p->key)
p=p->link;
else
if(x==p->key)
returnp;
else
{p=NULL;
returnp;
}
}
}
2.解:
算法思想是:
首先计算要删除的关键字为k的记录所在的位置,将其置为空(即删除),然后利用线性探测法查找是否有与k发生冲突而存储到下一地址的记录,如果有则将记录移到原来k所在的位置,直至表中没有与k冲突的记录为止。
实现本题功能的算法如下:
voiddelete(sqlistr,intn,intk)
{inth,h0,h1;
h=k%n;
while(r[h].key!
=k)
h=(h+1)%n;
r[h]=NULL;
h0=h;
hl=(h+1)%n;
while(hl!
=h)
{
while(r[h1].key%n!
=h)
hl=(hl+1)%n;
r[h0]=r[h1];
r[h1]=NULL;
h0=h1;
h1=(hl+1)%n;
}
}
3.解:
本题的算法思想:
先计算地址H(R.key),如果没有冲突,则直接填入;否则利用线性探测法求出下一地址,直到找到一个为零的地址,然后填入。
实现本题功能的函数如下:
voidinsert(recordH,intm,recordR)
{inti;
i=H(R.key);
if(H[i]==NULL)
H[i]=R;
else
{
while(H[i]!
=NULL)
i=(i+1)%(m+1);
H[i]=R;
}
}
模拟考试
查找应用题
1.在一棵空的二叉排序树中依次插入关键字序列为12,7,17,11,16,2,13,9,21,4,
试画出二叉排序树的草图,并回答下列问题。
(1)在二叉排序树查找9,依次和哪些关键字进行比较。
(2)求平均查找长度ASL
解:
(1)查找过程:
12,7,11,9。
8
(2)ASL=1/10(1×1+2×2+3×4+4×3)=29/10≈2.92
2.折半查找的的判定树如下图所示,
(1)若查找元素56,需依次与哪些元素比较?
(2)若查找元素16,需依次与哪些元素比较?
(3)假定每个元素的查找概率相等,求查找成功时的平均查找长度(保留2位小数)。
解:
(1)查找元素56,需依次与32,65,47,56等元素比较4
(2)查找元素16,需依次与32,5,18,16等元素比较4
(3)ASL=1/12(1×1+2×2+3×4+4×5)=37/12≈3.082
3.设哈希表的地址范围为0~17,哈希函数为:
H(K)=K%16。
其中K为关键字,用线性探测法再散列法处理冲突,输入关键字序列:
(10,24,32,17,31,30,46,47,40,63,49)。
其哈希表如下:
0
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)若查找关键字63,需要依次与哪些关键字进行比较?
(2)假定每个关键字的查找概率相等,求查找成功时的平均查找长度。
解:
(1)查找63,需要比较6次。
分别为:
31,46,47,32,17,63。
8
(2)ASL=1/11(1×6+2×1+3×3+6×1)=23/11=≈2.12
3.对于给定结点的关键字集合K={1,12,5,8,3,10,7,13,9},
(1)试构造一棵二叉排序树;
(2)如何依据此二叉排序树得到D的有序序列。
解:
(1)构造二叉排序树:
(2)按中序遍历二叉排序树可以得到D的有序序列。
4.对于给定结点的关键字集合K={15,9,20,12,17,4,18,10,29,6},构成一棵二叉排序树,并写出该二叉排序树中序遍历的结点序列。
解:
(1)构造二叉排序树
(2)中序遍历的结点序列:
4,6,9,10,12,15,17,18,20,29。
5.给定结点的关键字序列为:
47,7,29,11,16,92,22,8,3,哈希表的长度为11。
设散列函数为:
H(K)=K%11。
试画出线性探测再散列解决冲突时所构造的散列表,并求出其平均查找长度。
解:
(1)线性探测再散列解决冲突时所构造的散列表:
0
1
2
3
4
5
6
7
8
9
10
11
22
47
92
16
3
7
29
8
①②①①①④①②②
(2)平均查找长度ASL=(1*5+2*3+4*1)/9=15/9=5/3(或1.67)
6.给定结点的关键字序列为:
87,25,11,8,27,28,68,95,70,6,83,63,47,已知设散列函数为:
H(K)=K%13。
试画出链地址法解决冲突时所构造的哈希表,并求出其平均查找长度。
解:
(1)链地址法解决冲突时所构造的哈希表。
0
∧
1
27
∧
2
28
∧
3
68
∧
4
95
∧
5
70
83
∧
6
6
∧
7
∧
8
8
47
∧
9
87
∧
10
∧
11
11
63
∧
12
25
∧
(2)平均查找长度ASL=(1*10+2*3)/13=16/13(或1.23)
查找程序填空
1.从键盘输入若干个整数,以回车为间隔,以-1为结束符号,建立一个顺序存储的线性表,然后按提示输入一个待查找的数进行查找。
若找到,则显示找到的数据在线性表中的位置;否则显示“找不到”,试填空完成下列程序。
voidSeqSearch()
{inta[n],i,x,y;
cout<<"建立整数的顺序表(以回车为间隔,以-1结束):
";
for(i=1;i<=MAXLEN;i++)
{cin>>a[i];
if(a[i]==-1)
{y=i;break;}
}
cout<<"请输入要查找的数据:
";
cin>>x;
i=y-1;
while(i>=0&&a[i]!
=x)
i--;(或i=i+1)
if(i==0)
cout<<"没有找到";
else
cout<<"已找到,在第"<
}
2.对有序表R[0]至R[n-1]进行二分查找,查找成功时返回记录在表中的位置;查找失败时显示:
“没有找到!
”,试编写此程序。
voidBinSearch()
{intR[MAXLEN],i,low,high,mid,n,x;
charch;
cout<<"请输入要查找的数据:
";
cin>>x;
low=0;
high=n-1;
while(low<=high)
{mid=(low+high)/2;
if(R[mid]>x)
high=mid-1;
else
if(R[mid]low=mid+1;
else
break;
}
if(low>high)
{cout<<"没有找到!
";
if(R[mid]mid++;
cout<<"可将此数插入到"<";
}
else
cout<<"要找的数据"<}