(1.4.3.2)查找类

第八章 查找

一、选择题

1.适合于顺序查找法的存储结构是( A   )。

   A. 顺序存储和链式存储                     B. 索引存储

   C. 压缩存储                               D. 散列存储

2.进行二分法查找要求查找表(   C )。

   A. 采用链式存储结构且关键字有序           B. 采用顺序存储结构

   C. 采用顺序存储结构且关键字有序          D. 采用链式存储结构

3.对长度为n的线性表进行顺序查找,在等概率情况下,平均查找长度为(  D ).

   A.  n                 B.  n-1              C.   n/2           D.  (n+1)/2

4.设有序表的关键字序列为(2,23,34,45,65,76,87,89,201,223,320),当用二分法查找法查找关键字值为89的比较次数是(  )。

   A. 2                  B.   3               C.  4              D.   5

5.在分块查找中,若线性表中共有625个元素,当采用顺序查找确定块时,每块的长度是( B  )。

   A.   15                B.   25              C.   30            D.   35

6.采用二分法查找,平均查找长度为( D  )。

 A.  O(n)               B.   O(n2)            C.   O(nlog2n)      D.   O(log2n)

7.设有n个元素构成二叉排序树,最差情况下,平均查找长度是( B  )。

   A.  O(n)               B.   O(n2)            C.   O(nlog2n)      D.   O(log2n)

8.在m阶B-树除根结点外,其余结点的关键字个数至少应有( a )。

   A. 上|m/2| -1           B.             B.  +1      D.    m-1

9.设有n个元素构成二叉排序树,最好情况下,平均查找长度是( d  )。

   A.  O(n)               B.   O(n2)            C.   O(nlog2n)      D.   O(log2n)

10.在m阶B-树中插入一个关键字,首先插入在某个叶子结点上,若该结点的关键字树超过( d  )时,则应对该结点进行分裂。

   A.  -1           B.             B.  +1      D.    m-1

11.处理冲突的方法是( D  )。

   A.  除留余数法                              B.   平方取中法

   C. 随机数法                                D.   开放定址法

12.若表长为m,散列函数为h(key)=key%p ,则p的选取原则是( C  )。

   A.  p=m                                     B.   p<m

C.  p小于等于m并且为素数或不包含20以内的质因数的合数;

D.  p可取任何值。

13.长度为n的线性表进行顺序查找查找失败的平均查找长度是(   B)。

   A. (n+1)/2              B.  n+1            C.    n/2            D. n

14.二叉排序树如下:

查找成功的平均查找长度是(     )。

     A.  2.5              B.  3               C.  4                D.  2.8       

15.二叉排序树如14题所示,查找不成功的平均查找长度是(   )。

A.  2.5              B.  3               C.  4                D.  2.8     

 

二、填空题

1.在各种查找方式中,平均查找长度与结点个数n无关的查找方法是            。

2.二分法查找要求                 并且采用             。

3.在散列表中,       越大,发生         的机会越大。

4.在分块查找中,首先查找     ,然后查找          。

5.分块查找方法中,要求关键字逐块       ,块内元素关键字          。

6.对二叉排序树进行中序遍历所得遍历序列是                   。

7.因为散列函数是对可能的关键字到确定的有限地址集的压缩映像,所以        不可避免。

8.堆积是指         争夺同一个后继散列地址的现象。

9.在具有24个元素的有序表上,进行二分法查找。比较一次查找成功的结点数是       ,比较3次查找成功的结点数是         ,比较5次查找成功的结点数是         。平均查找长度是          。

10.二叉排序树上插入新结点,总是作为           ,无须移动其它结点,只需将某结点的对应孩子指针域由        改为                  。

11.B-树上的查找分为两个步骤,即读盘操作,属于外查找;在结点内查找,属于       。外查找的读盘次数不超过           。

12.散列查找的关键是选择一个“好”的        和          。

三、简答题

1.简述顺序查找、二分法查找和分块查找的优缺点。

2.依此输入关键字序列(23,35,18,30,80,20,16,40)试构成二叉排序树,并计算查找成功的平均查找长度和失败的平均查找长度。

3.已知关键字序列为(19,14,23,01,68,20,84,27,55,11,10,79),设散列函数为H(key)=key%13,采用拉链法解决冲突,试构造散列表。并计算查找成功的平均查找长度和失败的平均查找长度。

4.已知关键字序列为(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec),设散列函数为H(key)=ord(key首字母)%65/2,采用拉链法、线性探测法解决冲突,m=13试分别构造散列表。并计算查找成功的平均查找长度和失败的平均查找长度。

5.已知一个散列表如下图所示:

 

 

35

 

20

 

 

33

 

48

 

 

 59

  0    1    2    3     4    5     6    7     8    9    10    11   12

其散列函数h(key)=key%13,处理冲突的方法为双重散列法,探测序列为:

hi=(h(key)+i*h1(key))%m       i=0,1,2,…,m-1

其中 h1(key)=key%11+1 ,回答下列问题:

(1)对表中关键字35,20,33和48进行查找时,所需进行的比较次数各为多少?

(2)该散列表在等概率查找时查找成功的平均查找长度为多少?

6.在关键字序列(07,12,15,18,27,32,41,92)中用二分查找法查找和给定值92相等的关键字,请写出查找过程中依次和给定值“92”比较的关键字。

四、阅读程序题

1.阅读程序

     Linklist La=NULL;

void  inordbst(Bstree T)

{

 Linknode *p;

 if(T)

  {inordbst(T->rchild);

   p=(linknode *)malloc(sizeof(Linknode));

   p->data=t->key;

   p->next=La;

   La=p;

   inordbst(T->lchild);

   }

 }

(1)指出程序功能;

(2)若二叉排序树T右图所示:试画出*La的结构;

2.阅读程序指出程序功能

int  searchhash(keytype k, Hashtable T)

 { //T[0..m-1]为散列表,p<m

int  i=0,pos,h;

   h=k%p; pos=h;

   while(T[pos].key!=k&&T[pos].key)

{i++;

 pos=(h+i)%m;

}

if (T[pos].key==k) return pos;

else  return –1;

   }

3.阅读程序填上适当的语句(二分法查找)

int BinSearch(Seqlist R,keytype K)

{//R[1..n]为有序表

 int low=1,high=n,mid;

 while(low<=high)

 {    (1)      

  if (R[mid].key==K)return mid;

  if (R[mid].key>K)

      (2)      

  else

   low=mid+1;

  }

     (3)      

}

五、程序设计题

1.散列表中删除一个结点的算法。

2.二叉排序树查找的非递归算法。

3.链表结构上实现顺序查找,要求利用监视哨技术。

4.设顺序表中关键字是递增有序的,试写一顺序查找算法,将哨兵设在表的高下标端。然后求出等概率情况下查找成功与失败时的平均查找长度ASL。

5.试写出二分法查找的递归算法。

6.试写一算法判别给定的二叉树是否为二叉排序树,设此二叉树以二叉链表为存储结构,且树中结点的关键字均不相同。

7.试写一递归算法,从大到小输出二叉排序树中所有其值不小于x的关键字。要求算法的时间为O(lgn+m),n为树中结点数,m为输出的关键字个数(提示:先遍历右子树,后遍历左子树)。

8.写一个遍历B-树的算法,是输出的关键字序列递增有序。算法中的读盘操作可假定为Diskread。

9.若采用除余法作为散列函数,线性探测法解决冲突,则9.4.4节中通用的散列表查找算法可以改写为对线性探测法专用的算法:

假设散列表上的删除操作已将结点的关键字标记为DELETE(例如,不妨设DELETE为-2)。请修改上述散列表上的查找算法及插入算法Hashinsert,使之能正确的查找和插入。

10.用拉链法解决冲突,有关的类型说明和插入算法如下,请据此写出散列表的建表、查找及删除算法。

typedef struct node {

Keytype  key;

Infotype  otherinfo;

struct node  *next;

}Cnodetype;

typedef Cnodetype  *Chashtable[m];

void  chainhashinsert(Chashtable T,Keytype K){

  Cnodetype *p;

  int addr;

  p=chainhashsearch(T,K);

  if (p) printf("duplicate key!");

  else {

addr=K%m;

p=(Cnodetype*)malloc(sizeof(Cnodetype));

p->key=K;p->next=T[addr];T[addr]=p;

}endif

}//chainhashinsert

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值