若对大小均为n的有序顺序表和无序顺序表分别进行顺序查
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第九章 查找
9.1 若对大小均为n 的有序顺序表和无序顺序表分别进行顺序查找,试在下列三种情况下分别讨论两者在等概率时平均查找长度是否相同?
(1)查找不成功,即表中没有关键字等于给的值K 的记录;
(2)查找成功,且表中只有一个关键字等于给定值K 的记录;
(3)查找成功,且表中有若干关键字等于给定值K 的记录,要求找出所有这些记录。 答:(1)相同,有序n+1; 无序n+1
(2)相同,有序12n +;无序12
n + (3)不相同,对于有序表,找到了第一个与K 相同的元素后,只要再找到与K 不同的元素,即可停止查找;对于无序表,则要一直查找到最后一个元素。
9.3 画出对长度为13的有序表进行折半查找的判定树,并分别求其等概率时查找成功和查找不成功的ASL 。 答:查找成功:141(11223446)1313
ASL =
⨯+⨯+⨯+⨯= 查找失败:2615*3*414147ASL =+=(P220:查找不成功的过程就是走了一条从根节点到外部节点的路径,和给定值进行比较的关键字个数等于该路径上内部结点个数)
注:在折半查找判定树中,查找不成功时的比较次数即是查找相应外结点时与内结点的比较次数。整个判定树代表的有序表在查找失败时的平均查找长度即为查找每个外结点的比较次数之和除以外结点的个数。例如,长度为10的有序表在查找失败时的平均查找长度为:
ASL=(3×5+4×6)/11=39/11
第二次作业
9.4已知如下所示长度为12的表
(Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sep, Oct, Nov, Dec)每个元素的查找概率分别为(0.1,0.25,0.05,0.13,0.01,0.06,0.11,0.07,0.02,0.03,0.1,0.07)
(1)1n i i i ASL PC ==∑,Pi 为查找表中第i 个记录的概率,11n
i i P ==∑
ASL=0.1+0.25*2+3*0.05+4*0.13+5*0.01+6*0.06+7*0.11+8*0.07+9*0.02+10*0.03+11*0.1+12*0.07=5.43
或者
ASL=12*0.1+11*0.25+10*0.05+9*0.13+8*0.01+7*0.06+6*0.11+5*0.07+4*0.02+ 3*0.03+0.1*2+0.07=7.57
(2)画出初始为空,依次插入结点,生成的二叉排序树
(3)该二叉排序树查找成功的平均查找长度。
ASL=0.1+2*(0.25+0.05)+3*(0.13+0.01+0.06)+4*(0.11+0.07+0.02)+(0.03+0.07)*5+6 *0.1=3.2
(4)将二叉排序树中的结点Mar删除,画出经过删除处理后的二叉排序树
方法(1)
方法(2)
9.5在地址空间为0~16的散列区中,对以下关键字序列构造两个哈希表:(Jan,Feb,Mar,Apr,May,Jun,July,Aug,Sep,Oct,Nov,Dec)
(1)用线性探测开放定址法处理冲突;
(2)用链地址法处理。
分别求这两个哈希表在等概率情况下查找成功和不成功时的平均查找长度。设哈希表函数为H(x)=︱i/2 ︳,其中i为关键字中第一个字母在字母表中的序号。
(1)线性探测法
当发生冲突时,线性探测法从冲突位置的下一个位置起,依次寻找空的散列地址,即:
H i=(H(key)+d i) % m(d i=1,2,…,m-1)。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Apr Aug Feb Dec Jan Jun Mar May July Sep Oct Nov
等概率情况查找成功的ASL=(5*1+3*2+5+4+6+3)/12=29/12
查找不成功的ASL定义:查找不成功是需和给定值进行比较的关键字个数的期望值。
等概率情况查找不成功的ASL=(13+12+…+1+4*1)/17=95/17
(2)拉链法(链地址法)
用拉链法处理冲突构造的散列表叫做开散列表
等概率情况查找成功的ASL=(7*1+3*2+2*3)/12=19/12
等概率情况查找不成功的ASL=(10*1+4*2+1*3+2*4)/17=29/17
9.7写出判断一棵二叉树是否是二叉排序树的算法,设二叉排序树中不存在关键字值相同的结点
二叉排序树定义如下,二叉排序树或者是一棵空树;或者是具有下列性质的树。 1,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 2,若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 3,它的左右子树也分别为二叉排序树
int last=0,flag=1;
int Is_BSTree(Bitree T)//判断二叉树T 是否二叉排序树,是则返回1,否则返回0 {
if(T->lchild&&flag) Is_BSTree(T->lchild);
if(T->data last=T->data; if(T->rchild&&flag) Is_BSTree(T->rchild); return flag; }//Is_BSTree 根据递规定义,如下的递规算法: typedef struct node 12345678910111213141516 { datatype data; struct node left,right; }NODE,*TREE; int IsBST0(TREE t, int *pmax, int *pmin) { int max, min; if(!t->left) *pmin=t->data; else{ if(!IsBST0(t->left,&max,&min) return 0; if(max>t->data) return 0; *pmin=min; } if(!t->right) *pmax=t->data; else{ if(!IsBST0(t->right,&max,&min) return 0; if(min>t->data) return 0; *pmax=max; } return -1; } int IsBST(TREE) { int max,min; if(!t) return -1; else return IsBST0(t,&max,&min); }