- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构C语言版第八章 查找.doc
第八章 查找
重点难点
要求理解查找表的结构特点以及各种表示方法的适用性;熟练掌握顺序查找和折半查找的方法;熟悉描述折半查找过程的判定树的构造方法;熟练掌握二叉排序树的构造和查找方法;理解二叉平衡树的构造过程;理解B-和B+树的特点、基本操作和二者的区别。熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别;掌握各种不同查找方法之间的区别和各自的适用情况,能按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。
典型例题
1. 若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:
(1)查找不成功,即表中无关键字等于给定值K的记录;
(2)查找成功,即表中有关键字等于给定值K的记录。
【解】 查找不成功时,需进行n+1次比较才能确定查找失败。因此平均查找长度为n+1,这时有序表和无序表是一样的。
查找成功时,平均查找长度为(n+1)/2,有序表和无序表也是一样的。因为顺序查找与表的初始序列状态无关。
2. 画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数。 等概率情况下,查找成功的平均查找长度为: ASL=(1+2*2+3*4+4*8+5*3)/18=3.556?查找失败时,最多的关键字比较次树不超过判定树的深度,此处为5. 设散列表长度为11,散列函数h(x)=x%11,给定的关键字序列为:1,13,13,34,38,33,27,22.试画出分别用拉链法和线性探查法解决冲突时所构造的散列表,并求出在等概率情况下,这两种方法查找成功和失败时的平均查找长度。请问装填因子的值是什么??
答:
(1)拉链法如下图:
? T[0..10]
??? ┌──┐
?? 0│??? │→ 33 → 22 →∧
??? ├──┤
?? 1│??? │→ 1 → 12 →34→ ∧
??? ├──┤
?? 2│??? │→ 13 →∧
??? ├──┤
?? 3│ ∧ │
??? ├──┤
?? 4│ ∧ │
??? ├──┤
?? 5│??? │→ 38 → 27 →∧
├──┤
6│ ∧ │
??? ├──┤
?? 7│ ∧ │
??? ├──┤
?? 8│ ∧ │
??? ├──┤
?? 9│ ∧ │?
??? ├──┤
? 10│ ∧ │
??? └──┘
? (2)线性探查法如下图:
????? 下标?? 0?? 1?? 2?? 3?? 4?? 5?? 6?? 7?? 8?? 9? 10?
????????? ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
? T[0..10]│33│1 │13│12│34│38│27│22│? │? │? │
????????? └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
? 探查次数?? 1?? 1?? 1?? 3?? 4?? 1?? 7?? 8
? 用拉链法的查找成功平均查找长度为:
??? ASLsucc=(1*4+2*3+3*1)/8=1.625
? 查找失败时平均查找长度为:
??? ASLunsucc=(2+3+1+0+0+0+2+0+0+0+0)/11=0.73
? 用线性探查法查找成功时平均查找长度为:
??? ASLsucc=(1+1+1+3+4+1+7+8)/8=3.25
? 查找失败时平均查找长度为:
??? ASLunsucc=(9+8+7+6+5+4+3+2+1+1+1)/11=4.3
? 装填因子α拉链=4/11=0.36 α线性探查=8/11=0.73
typedef BinTNode *DataType;//循环队列中元素为二叉树结点指针
int BinSortStree(BinTree T)
{
CirQueue Q;
BinTNode *p;
if (!T) return 1;//空树为二叉排序树
InitQueue(Q);
EnQueue(Q,T);
while(!QueueEmpty(Q))
{
p=DeQueue(Q);
if (p-lchild)
if (p-datap-lchild-data) return -1;//不是二叉排序树
else EnQueue(Q,p-lchild);
if (p-rchild)
if (p-datap-rchild-data) return -1;//不是二叉排序树
else EnQueue(Q,p-rchild);
}
return 1;//是二叉排序树
文档评论(0)