数据结构 第八章 查找表 下载本文

为“真”;若值为k的结点不在树中,或者虽然在树中,但不是叶子结点,则不进行删除,仅置success为“假”。应注意到非空查找树只包含一个结点情况,此时树中的唯一结点,既是根结点,也是叶子结点。 #include typedef struct node { int key;

struct node *left, *right; } node;

node *root; int k,success;

void del_leaf(node **t, int k, int *sn) { node *p, *pf; p=*t; *sn=0; while(_(1)_&&!*sn) if (k==p->key) *sn =1;

else { _(2)_;

if (kkey ) p=p->left; else p=p->right; }

if (*sn && p->left==NULL && p->right==null) { if (_(3)_ )

if (pf->left ==p ) pf ->left=null; else pf->right=null; else _(4)_ ; free(p); } else *sn=0;

/*call form :del_leaf( &root, k, &success);*/

四、应用题

1. 名词解释:

哈希表

同义词:叙述B-树定义,主要用途是什么?它和B+树的主要差异是什么? B-树

平衡二叉树(AVL树)? 平衡因子平均查找长度(ASL) trie树。 2. 回答问题并填空

(1)散列表存储的基本思想是什么?

(2)散列表存储中解决碰撞的基本方法有哪些?其基本思想是什么?

(3)用分离的同义词子表解决碰撞和用结合的同义词表解决碰撞属于哪种基本方法?他们

各有何特点?

(4)用线性探查法解决碰撞时,如何处理被删除的结点?为什么?

(5)散列法的平均检索长度不随( )的增加而增加,而是随( )的增大而增加。 3. 如何衡量hash函数的优劣? 简要叙述hash表技术中的冲突概念,并指出三种解决冲

突的方法。

4.HASH方法的平均查找路长决定于什么? 是否与结点个数N有关? 处理冲突的方法主要有哪些?

5.在采用线性探测法处理冲突的散列表中,所有同义词在表中是否一定相邻?

6. 设有一组关键字{9,01,23,14,55,20,84,27},采用哈希函数:H(key)=key mod 7 ,表长为10,用开放地址法的二次探测再散列方法Hi=(H(key)+di) mod 10(di=1,2,3,?,)解决冲突。要求:对该关键字序列构造哈希表,并计算查找成功的平均查找长度。 7.对下面的关键字集{30,15,21,40,25,26,36,37}若查找表的装填因子为0.8,采用线性探测再散列方法解决冲突,做:

(1)设计哈希函数; (2)画出哈希表;

(3)计算查找成功和查找失败的平均查找长度;(4)写出将哈希表中某个数据元素删除的算法;

8.设哈希表a 、b分别用向量a[0..9],b[0..9]表示 ,哈希函数均为H(key)=key MOD 7,处理冲突使用开放定址法,Hi=[H(key)+Di]MOD 10,在哈希表a中Di用线性探测再散列法,在哈希表b中Di用二次探测再散列法,试将关键字{19,24, 10,17,15,38,18,40}分别填入哈希表a,b中,并分别计算出它们的平均查找长度ASL。

9.采用哈希函数H(k)=3*k mod 13并用线性探测开放地址法处理冲突,在数列地址空间[0..12]中对关键字序列22,41,53,46,30,13,1,67,51

(1)构造哈希表(画示意图);(2)装填因子;等概率下(3)成功的和(4)不成功的平均查找长度。

10. 常用的构造哈希函数的方法有哪些?若在哈希表中删除一个记录,应如何操作?为什么?已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79)按哈希函数 H(Key)=Key MOD 13和线性探测再散列处理冲突的方法在地址空间A[0..15]中构造哈希表。 11. 设哈希函数H(k)=3 K mod 11,散列地址空间为0~10,对关键字序列

(32,13,49,24,38,21,4,12)按下述两种解决冲突的方法构造哈希表(1)线性探测再散列(2)链地址法,并分别求出等概率下查找成功时和查找失败时的平均查找长度ASLsucc和ASLunsucc。

2

2

2

12. 使用散列函数hashf(x)=x mod 11,把一个整数值转换成散列表下标,现要把数据:1,13,12,34,38,33,27,22插入到散列表中。 (1)使用线性探查再散列法来构造散列表。(2)使用链地址法构造散列表。

针对这两种情况,确定其装填因子,查找成功所需的平均探查次数,以及查找不成功所需的平均探查次数。

13. 已知长度为12 的表(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)

(1) 试按表中元素的顺序依次插入一棵初始为空的分类二叉树,试画出插入完成之后

的分类二叉树并计算其在等概率查找情况下,查找成功的平均查找长度。 (2) 试用以下两种方法构造两个Hash表,Hash函数H(K)=[i/2],其中i为关键字K

中第一个字母在字母表中的序号,[x]表示取整数。 a. 用线性探测开放定址法处理冲突(散列地址空间为0~16);

b. 用链地址法处理,然后分别求出这两个Hash表在等概率查找情况下,查找成功的平均查找长度。

14. 设散列函数H(k)=K mod 7,散列表的地址空间为0-6,对关键字序列

{32,13,49,18,22,38,21}按链地址法处理冲突的办法构造哈希表,并指出查找各关键字要进行几次比较。

15. 选取哈希函数H(key)=key mod 7,用链地址法解决冲突。试在0-6的散列地址空间内对关键字序列{31,23,17,27,19,11,13,91,61,41}构造哈希表,并计算在等概率下成功查找的平均查找长度。

16. 设散列函数为H(K)=K MOD 11,解决冲突的方法为链接法,试将下列关键字集合{35,67,42,21,29,86,95,47,50,36,91}依次插入到散列表中(画出散列表的示意图)。并计算平均查找长度ASL。

17. 设输入的关键字序列为:22,41,53,33,46,30,13,01,67, Hash函数为:H(key)=key MOD 11。HASH表长度为11。试用线性探测法解决冲突,将各关键字按输入顺序填入Hash表中。 18. 设哈希(Hash)表的地址范围为0~17,哈希函数为:H (K)=K MOD 16, K为关键字,用线性探测再散列法处理冲突,输入关键字序列: (10,24,32,17,31,30,46,47,40,63,49)造出哈希表,试回答下列问题:

(1) 画出哈希表示意图; (2) 若查找关键字63,需要依次与哪些关键字比较?

(3) 若查找关键字60,需要依次与哪些关键字比较?

(4) 假定每个关键字的查找概率相等,求查找成功时的平均查找长度。

19. 试为下列关键字设计哈希表,要求所设计的表在查找成功时的平均查找长度不超过

2.0。并请验证你造的哈希表的实际平均查找长度是否满足要求。

(CHA,CAI,LAN,WEN,LONG,ZHAO,WU,LIU,CHEN,LI,WANG,CAO,YUN,CHANG,YANG)

20. 设a,b,c,d,e五个字符的编码分别为1,2,3,4,5,并设标识符依以下次序出现:

ac,bd,aa,be,ab,ad,cd,bc,ae,ce。要求用哈希(Hash)方法将它们存入具有10个位置的表中。

(1)将上述关键字(标识符)构造一个哈希函数,使得发生冲突尽可能地少;(2)线性探测再散列法解决冲突。

写出上述各关键字在表中位置。

21. 对以下关键字序列建立哈希表:(SUN,MON,TUE,WED,THU,FRI,SAT),哈希函数为H(K)=(关键字中第一个字母在字母表中的序号)MOD 7,用线性探测法处理冲突,求构造一个装填因子为0.7的哈希表;并分别计算出在等概率情况下查找成功与不成功的平均查找长度。 22. 设散列表为HT [0..12],即表的大小为m=13。现采用双散列法解决冲突。散列函数和再散列函数分别为:

H0(key)=key % 13; 注:%是求余数运算(=mod)

Hi=(Hi-1+REV(key+1)+1) % 13; i=1,2,3,?,m-1

其中,函数REV(x)表示颠倒10进制数x的各位,如REV(37)=73,REV(7)=7等。若插入的关键码序列为(2,8,31,20,19,18,53,27)。

(1)试画出插入这8个关键码后的散列表;(2)计算搜索成功的平均搜索长度ASL。 23. 设一个散列表含hashsize=13个表项,其下标从0到12,采用线性探查法解决冲突。请按以下要求,将关键码{10,100,32,45,58,126,3,29,200,400,0}散列到表中。

(1)散列函数采用除留余数法,用%hashsize(取余运算)将各关键码映像到表中,请指出每一个产生冲突的关键码可能产生多少次冲突。

(2)散列函数采用先将关键码各位数字折叠相加,再用%hashsize将相加的结果映像到表中的办法。请指出每一个产生冲突的关键字码可能产生多少次冲突。

24. 已知一组关键字为(26,36,41,38,44,15,68,12,06,51,25),用链地址法解决冲突。假

设装填因子a=0.75,散列函数的形式为H(K)=K MOD P,回答下列问题: (1) 构造出散列函数;(2)计算出等概率情况下查找成功的平均查找长度;) (3) 计算出等概率情况下查找失败的平均查找长度; 25. 在B-树和B+树中查找关键字时,有什么不同? 26. 简要叙述B树(有些教材中称为B-树)与B+树的区别?

27. 包括n个关键码的m阶B-树在一次检索中最多涉及多少个结点?(要求写出推导过程。) 28. 给定关键码序列(26,25,20,33,21,24,45,204,42,38,29,31),要用散列法进行存储,规定负载因子α=0.6。

(1)请给出除余法的散列函数。

(2)用开地址线性探测法解决碰撞,请画出插入所有的关键码后得到的散列表,并指出发生碰撞的次数。