数据结构查找

上传人:工**** 文档编号:578471645 上传时间:2024-08-24 格式:PPT 页数:80 大小:839.50KB
返回 下载 相关 举报
数据结构查找_第1页
第1页 / 共80页
数据结构查找_第2页
第2页 / 共80页
数据结构查找_第3页
第3页 / 共80页
数据结构查找_第4页
第4页 / 共80页
数据结构查找_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《数据结构查找》由会员分享,可在线阅读,更多相关《数据结构查找(80页珍藏版)》请在金锄头文库上搜索。

1、1、静态查找表2、动态查找表3、哈希查找表第八章 查找术语: 查找(检索)根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素 关键字是记录某个数据项的值,它可以唯一标识 一个记录。 次关键字不能唯一的确定一个记录,但能确定表的一个子表。子表的元素个数应远少于表中元素数。 为简化问题,将表中元素看成简单的整型数据,理解为关键字部分。8.1 8.1 静态查找表静态查找表 1、顺序表的顺序查找应用范围:顺序表或线性链表表示的表,表内元素之间无序。 查找过程:从表的一端开始逐个进行记录的关键字和给定值的比较。search(st,key,n)/在有n个数据的表st中找key i=n-1;

2、while(i=0 & sti!=key) i- -; if(i0) return -1; /查找不成功返回-1 else return i; /查找成功返回下标号 算法主要时间在循环,为减少判定,n个数据用容量为n+1的一维数组表示。st1到stn存储数据,st0作为监视哨search1(st,key,n) st0=key; i=n; while(sti!=key) i- -; return i; /查找返回序号,0为不成功 顺序查找的平均时间为表长的一半。2、顺序有序表的查找 二分(折半)查找查找过程:每次将待查记录所在区间缩小一半适用条件:采用顺序存储结构的有序表算法实现设表长为n,lo

3、w、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定的待查值初始时,令low=1,high=n,mid=(low+high)/2让k与mid指向的记录比较:若k=rmid,查找成功,结束若krmid,则low=mid+1重复上述操作,直至lowhigh时,查找失败highmidlowbin_search(st,key,n) low=0; high=n-1; while(lowkey) high=mid-1; else low=mid+1; return -1; mid=(low+high)1;递归:bin_search(st,key,l,h) if(l1; if( stmi

4、d = = key) return mid; else if(stmidkey) return bin_search(st,key,l,mid-1); else return bin_search(st,key,mid+1,h) else return -1; 平均查找时间3、分块查找数据组织: 将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找 (1)用数组存放待查记录, (2)建立索引表,由每块中最大(小)的关键字及所属块位置的信息组成。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1822 12 13 8 9 20 33 42 44

5、 38 24 48 60 58 74 57 86 5322 48 861 7 13索引表查38当索引表较大时,可以采用二分查找在数据量极大时,索引可能很多,可考虑建立索引表的索引,即二级索引,原则上索引不超过三级分块查找方法评价由上面的公式,在n一定时,可以通过选择s使ASL尽可能小可以证明,当 时,对于(1)ASL最小。小结: 时间:顺序查找最差,二分最好,分块介于两者之间 空间:分块最大,需要增加索引数据的空间 特点: 1)顺序查找对表没有特殊要求 2)分块时数据块之间在物理上可不连续。所以可以达到插入、删除数据只涉及对应的块;另外,增加了索引的维护。 3)二分查找要求表有序,所以若表的元

6、素的插入与删除很频繁,维持表有序的工作量极大。 4)在表不大时,一般直接使用顺序查找。二分查找的C/C+接口stdlib.hvoid *bsearch(void *key,void *base,int nelement,int size, int (*fcmp)(const void *,const void *)其中:fcmp规定: 第一个数据小于第二个,返回小于0的数 第一个数据等于第二个,返回0 第一个数据大于第二个,返回大于0的数#include #include cmp(const void *a, const void *b)if(*(int *)a*(int *)b) retur

7、n -1;else if(*(int *)a=*(int *)b) return 0;else return 1; void main()int ar=-2,3,6,9,10,21,22,34,56;int *p;int t;t=9;p=(int *)bsearch(&t,ar,sizeof(ar)/sizeof(int),sizeof(int), cmp);if(p!=NULL) cout*pdata) return t; else if(key data) return SearchBST(t-lchild,key); else return SearchBST(t-rchild,key)

8、; / SearchBST3、插入算法: 首先执行查找算法,找出被插结点的父亲结点。 判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。 若二叉树为空。则首先单独生成根结点。 注意:新插入的结点总是叶子结点。例:将序列:122、99、250、110、300、280 作为二叉排序树的结点的关键字值,生成二叉排序树。12299250300280110void InsertBST(*&t,key) /在二叉排序树中插入查找关键字key if(t= = NULL) t=new BiTree; t-lchild=t-rchild=NULL; t-data=key; return; if(

9、keydata ) InsertBST(t-lchild,key); else InsertBST (t-rchild, key ); void CreateBiTree(tree,d ,n)/n个数据在数组d中,tree为二叉排序树根 tree=NULL; for(i=0;irchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-da

10、ta=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;void delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q

11、-lchild=s-lchild; delete s;pqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;pqvoid delete(*&

12、p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;pqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; d

13、elete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;pqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-

14、rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;pqsvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; wh

15、ile(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;psqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-dat

16、a=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;psdqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; els

17、e q-lchild=s-lchild; delete s;dpsdqvoid delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;dpsdqvoid

18、delete(*&p) if(p-rchild = = NULL) q=p; p=p-lchild; delete q; else if(p-lchild= =NULL) q=p; p=p-rchild; delete q; else q=p; s=p-lchild; while(s-rchild!=NULL) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s;p等于q的情况spxqsxqp删除一个结点:DeleteBST( *&t,key)/ 在根为t的排序

19、二叉树中删去值为key的结点 if(!t) return else if(t-data=key) delete(t); else if(t-datakey) DeleteBST(t-lchild,key); else DeleteBST(t-rchild,key);DABCFEG二、平衡二叉树起因:提高查找速度,避免最坏情况出现。如下图单枝情况的出现。平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义) 平衡二叉树:每个结点的平衡因子都为 1、1、0 的二叉排序树。或者说每个结点的左右子树的高度最多差1的二叉排序树。1、概念与定义例:0141253928635

20、36050171873011-1-1-100000000平衡二叉树028181453963536050173012-1-100001-1 非平衡二叉树02、平衡树的平衡方法: 在左图所示的平衡树中插入数据为2的结点。 插入之后仍应保持平衡分类二叉树的性质不变。14125392863536050171873011-1-1-100000000平衡树1412539286353605017187301-1-1-1000000002112原平衡度为0不平衡点解决:如何用最简单、最有效的办法保持平衡分类二叉树的性质2141253928635360501718730+1+1-1-1-100000000211

21、2原平衡度为0不平衡点Adelson解决思路:不涉及到不平衡点的双亲,即以不平衡点为根的子树的高度应保持不变。新结点插入后,向根回溯找到第一个原平衡因子不为0的结点(如图中9)。新插入的结点和第一个平衡因子不为0的结点之间的结点,其平衡因子原皆为0在调整中,仅涉及前面所提到的最小子树(如:以9为根的子树)仍应保持排序二叉树的性质不变。3、平衡种类分析 左调整(新结点插入在左子树上的调整):1、LL 情况:(插入在结点左子树的左子树上)LL 旋转旋转前后:高度都为 h + 11h-10AB1h-12hh-1BRARBLBA0h0h-1h-1BRARBL旋旋转算法算法void LL_rotate(

22、BBSTNode *a)void LL_rotate(BBSTNode *a) BBSTNode *b ; BBSTNode *b ;b=a-Lchild ; a-Lchild=b-Rchild ;b=a-Lchild ; a-Lchild=b-Rchild ;b-Rchild=a ;b-Rchild=a ;a-Bfactor=b-Bfactor=0 ; a=b ;a-Bfactor=b-Bfactor=0 ; a=b ; 2、LR 情况:(新插入结点在左子树的右子树上)h-1旋转前后高度仍然是 h + 1h-1CB0h-1BLARACRh-2CLh-1-10BLAB1h-102-1ARARC

23、CRCLh-2h -101LR旋转旋旋转算法算法void LR_rotate(BBSTNode *a)void LR_rotate(BBSTNode *a) BBSTNode *b,*c ; BBSTNode *b,*c ;b=a-Lchild ; c=b-Rchild ; b=a-Lchild ; c=b-Rchild ; /* /* 初始化初始化 * */ /a-Lchild=c-Rchild ; b-Rchild=c-Lchild ;a-Lchild=c-Rchild ; b-Rchild=c-Lchild ;c-Lchild=b ; c-Rchild=a ;c-Lchild=b ; c

24、-Rchild=a ;if (c-Bfactor=1) if (c-Bfactor=1) a-Bfactor=-1 ;b-Bfactor=0 ; a-Bfactor=-1 ;b-Bfactor=0 ; else if (c-Bfactor=0) a-Bfactor=b-else if (c-Bfactor=0) a-Bfactor=b-Bfactor=0 ;Bfactor=0 ;else a-Bfactor=0 ;b-Bfactor=1 ; else a-Bfactor=0 ;b-Bfactor=1 ; 右调整(新结点插入在右子树上进行的调整)1、RR 情况:(插入在的右子树的右子树上) 处理

25、方法和 LL对称2、RL 情况:(插入在右子树的左子树上) 处理方法与LR对称平衡树建立方法:(1)按二叉排序树插入结点(2)如引起结点平衡因子变为|2|,则确定旋转点,该点是离根最远(或最接近于叶子的点)(3)确定平衡类型后进行平衡处理,平衡后以平衡点为根的子树高不变589162127431011二叉排序树二叉平衡树811122371095614采用B_树和 B+ 树目的 应文件系统的要求而发展起来的,大量数据存放在外存中,通常存放在硬盘中。由于是海量数据,不可能一次调入内存。因此,要多次访问外存。但硬盘的驱动受机械运动的制约,速度慢。所以,主要矛盾变为减少访外存次数。 在 1972 年由

26、R .Bayer 和 E .Macreight 提出用B_树作为索引组织文件。提高访问速度、减少时间。8.2.2 B_树和B+树一、 B_树及其操作1、m 阶B_树定义:m 阶B_树满足或空,或为满足下列性质的m叉树:(1) 树中每个结点最多有m 棵子树(2) 根结点在不是叶子时,至少有两棵子树(3) 除根外,所有非终端结点至少有 m/2棵子树 (4) 有 s 个子树的非叶结点具有 n=s -1个关键字,结点的信息组织为:(n,A0,K1,A1,K2,A2 Kn,An) 这里:n:关键字的个数,ki(i=1,2,n)为关键字,且满足KiKi+1,,Ai(i=0,1,.n)为指向子树的指针。(5

27、)所有的叶子结点都出现在同一层上,不带信息(可认为外部结点或失败结点)。例: 4阶B_树。除根结点和叶子结点之外,每个结点的子树个数至少为 m/2 = 2个;结点的关键字个数至少为1。该B_树的深度为4。叶子结点都在第4层上。蓝色代表结点中关键字个数黑色代表结点中关键字第1层第2层第3层第4层1 331 182 43 781 111 271 391 993 47 58 64FFFFFFFFFFFF3、 B_树的查找: 查找过程,类似于二叉树的查找,关键字为key的记录。 从根开始在结点中顺序或二分(当 m 较大时)查找,如果 Ki = key 则查找成功, 若 KikeyKi+1:顺Ai指向的

28、子树重复查找 若 keyKn;:找顺An指向的子树重复查找 若找到叶子,则查找失败。4、 B_树中结点的插入 m代表B_树的阶,插入总发生在最低层 1) 插入后关键字个数小于等于 m-1,完成。2) 插入后关键字个数等于 m,结点分裂,以中点数据为界一 分为二,中点数据放到双亲结点中。这样就有可能使得 双亲结点的数据个数为m,引起双亲结点的分裂,最坏情况下一直波及到根,引起根的分裂B_树长高。1224 30457053902610039506185例:3 阶 B_树的插入操作。最多3棵子树,2个数据;最少2棵子树,1个数据。 所以3阶B_树也称为2-3树。插入位置插入数据 : 33312243

29、04570539026100395061857243034570539026100395061851230324457053902610039506185127100303245390263950618512745707插入75、 B_树中结点的删除* 删除发生在最底层(1)被删关键字所在结点中的关键字数目大于等于 m/2 ,直接删除。(2) 删除后结点中数据为m/2-2,而相邻的左(右)兄弟中数据大于m/2 -1,此时左(右兄弟)中最大(小)的数据上移到双亲中,双亲中接(靠)在它后(前)面的数据移到被删数据的结点中。32445539037100506170被删关键字3244561903710

30、05370(3) 其左右兄弟结点中数据都是 m/2 -1,此时和左(右)兄弟合 并,合并时连同双亲中相关的关键字。此时,双亲中少了一项,因此又可能引起双亲的合并,最坏一直到根,使B-树降低一层。324459010061703244590371006170删除3732445901006170* 删除不在最底层 在大于被删数据中选最小的代替被删数据,按B_树性质,其位置如下图所示(x是要删除的数据)xy用于代替x的数据问题转换成在最底层的删除作业:试从空树开始,画出按以下次序向2-3树中插入数据的建树过程:20 ,30,50,52,60,68,70。如果以后删除50和68,画出每一步执行后2-3树

31、的状态。二、B+树 在实际的文件系统中,用的是B+树或其变形。有关性质与操作类似与B_树。1、差异:(1)有n棵子树的结点中有n个关键字(2)所有叶子结点中包含全部关键字信息及对应记录位置信息(3)所有非叶子为索引,只含关键字而且仅有子树中最大或最小的信息。(4)非叶最底层顺序联结,这样可以进行顺序查找59 9715 44 5910 15010203060910对应01的记录2查找过程在 B+ 树上,既可以进行缩小范围的查 找,也可以进行顺序查找; 在进行缩小范围的查找时,不管成功与否,都必须查到叶子结点才能结束;若在结点内查找时,给定值Ki, 则应继续在 Ai 所指子树中进行查找3插入和删除

32、的操作类似于B_树进行,即必要时,也需要进行结点的“分裂”或“合并”。8.3 哈希表 前面查找方法共同特点:通过将关键字值与给定值比较,来确定位置。效率取决比较次数。 理想的方法是:不需要比较,根据给定值能直接定位记录的存储位置。这样,需要在记录的存储位置与该记录的关键字之间建立一种确定的对应关系,使每个记录的关键字与一个存储位置相对应。例 1949-2000年某地区人口统计表可以按公式确定其人数: y年人数=表y-1948年份人数1 2 3 . 51 52194919501951 . 19992000200021002200 . 440044201.哈希(也称为Hash、杂凑、散列)基本思想

33、 在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到元素。 哈希函数在记录的关键字与记录的存储位置之间建立的一种对应关系。 哈希函数是一种映象,是从关键字空间到存储位置空间的一种映象。哈希函数可写成: addr(ai)=h(ki)ai是表中的一个元素addr(ai)是ai的存储位置信息ki是ai的关键字哈希表应用哈希函数,由记录的关键字确定记录在表中的位置信息,并将记录根据此信息放入表中,这样构成的表叫哈希表。哈希查找利用哈希函数进行查找的过程。 除了特别简单的应用,在大多数情况下,所构造出的哈希函数是多对一的(非单射函数)。即可能有多个不同的关键字,它

34、们对应的哈希函数值是相同的,这意味着不同记录由哈希函数确定的存储位置是相同的。这种情况被称为冲突。即: 若key1不等于key2,而h(key1)=h(key2) Hash查找适合于关键字可能出现的值的集合远远大于实际关键字集合的情形。根据抽屉原理,冲突是不可能完全避免的,所以,要解决:(1)构造一个性能好,冲突少的Hash函数(2)如何解决冲突2、常用的哈希函数(1)直接定址法构造:取关键字或关键字的某个线性函数作哈希地址,即H(key)=key 或 H(key)=akey+b特点: 直接定址法所得地址集合与关键字集合大小相等,不会发生冲突 实际中能用这种哈希函数的情况很少。此法仅适合于:地

35、址集合的大小 = = 关键字集合的大小(2)数字分析法 构造:对关键字进行分析,取关键字的若干位或其组合作哈希地址。 例 有80个记录,关键字为8位十进制数,哈希地址为2位十进制数8 1 3 4 6 5 3 28 1 3 7 2 2 4 28 1 3 8 7 4 2 28 1 3 0 1 3 6 78 1 3 2 2 8 1 7 8 1 3 3 8 9 6 78 1 3 6 8 5 3 78 1 4 1 9 3 5 5. 分析: 只取8 只取1 只取3、4 只取2、7、5 数字分布近乎随机所以:取任意两位或两位 与另两位的叠加作哈希地址此方法仅适合于: 能预先估计出全体关键字的每一位上各种数字

36、出现的频度。(2)数字分析法 构造:对关键字进行分析,取关键字的若干位或其组合作哈希地址。 以关键字的平方值的中间几位作为存储地址。求“关键字的平方值” 的目的是“扩大差别” ,同时平方值的中间各位又能受到整个关键字中各位的影响。(3)平方取中法(4)折叠法构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分割后的几部分低位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。例 关键字为 :0442205864,哈希地址位数为45 8 6 44 2 2 00 41 0 0 8 8H(key)=0088移位叠加5 8 6 40 2 2 40

37、4 6 0 9 2H(key)=6092间界叠加 此方法适合于:关键字的数字位数特别多,且每一位上数字分布大致均匀情况。(4)折叠法构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分割后的几部分低位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。(5)除留余数法构造:取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(key)=key % p,pm特点:简单、常用,可与上述几种方法结合使用p的选取很重要;p选的不好,容易产生同义词(6)随机数法构造:取关键字的伪随机函数值作哈希地址,即H(key)=random(key

38、)适于关键字长度不等的情况说明: 哈希函数构造不应太复杂 不存在绝对好和坏的函数3 3、冲突解决、冲突解决A)A)开放定址法开放定址法方法:当冲突发生时,形成一个探查序列;沿此序列逐方法:当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放到该地址中,即发生冲突的记录放到该地址中,即H Hi i=(H(key)+d=(H(key)+di i) % m) % m,i=1,2,k(ki=1,2,k(k m-1)m-1)其中:其中:H(key)H(key)哈希函数哈希函数 mm哈希表表长哈希表表长

39、d di i增量序列增量序列分类分类线性探测再散列:线性探测再散列:d di i=1,2,3,m-1=1,2,3,m-1二次探测再散列:二次探测再散列:d di i=1,-1,2,-2,3,k(k=1,-1,2,-2,3,k(k m/2)m/2)伪随机探测再散列:伪随机探测再散列:d di i= =伪随机数序列伪随机数序列例 已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79) 哈希函数为:H(key)=key % 13, 哈希表长为m=16, 设每个记录的查找概率相等 用线性探测再散列处理冲突,即Hi=(H(key)+di) % mH(55)=3 冲突-H1

40、=(3+1)%16=4 冲突-H2=(3+2)%16=5H(79)=1 冲突- H1=(1+1)%16=2 冲突- H2=(1+2)%16=3 冲突-H3=(1+3)%16=4 冲突- H4=(1+4)%16=5 冲突-H5=(1+5)%16=6 冲突- H6=(1+6)%16=7 冲突-H7=(1+7)%16=8 冲突-H8=(1+8)%16=90 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1514 1 68 27 55 19 20 84 79 23 11 10H(19)=6H(14)=1H(23)=10H(1)=1 冲突-H1=(1+1) %16=2H(68)=3H

41、(20)=7H(84)=6 冲突-H1=(6+1)%16=7 冲突-H2=(6+2)%16=8H(27)=1 冲突-H1 =(1+1)%16=2 冲突- H2=(1+2)%16=3 冲突-H2=(1+3)%16=4H(11)=11H(10)=10 冲突-H1=(10+1)%16=11 冲突-H2=(10+2)%16=12开放定址法的几个问题 1)删除:只能作标记,不能真正删除 2)溢出 3)聚集问题12345678x线性探测法的特点线性探测法的特点 优点优点:只要散列表未满:只要散列表未满,总能找到一个不冲突的散列地址总能找到一个不冲突的散列地址; 缺点缺点:每个产生冲突的记录被散列到离冲突最

42、近的空地址:每个产生冲突的记录被散列到离冲突最近的空地址上上,从而又,从而又增加了更多的冲突机会增加了更多的冲突机会( (这种现象称为冲突的这种现象称为冲突的“聚聚集集”) )。二次探二次探测法法增量序列为:增量序列为:d di i=1,-1,2,-2,3,k (k=1,-1,2,-2,3,k (k m/2m/2 ) )二次探测法的特点二次探测法的特点 优点优点:探测序列跳跃式地散列到整个表中:探测序列跳跃式地散列到整个表中,不易产生,不易产生冲突冲突的的“聚集聚集”现象;现象; 缺点缺点:不能保证探测到散列表的所有地址:不能保证探测到散列表的所有地址。 伪随机探随机探测法法 增量序列使用一个

43、增量序列使用一个伪随机函数来产生一个伪随机函数来产生一个落在闭区落在闭区间间1,m-1的的随机序列随机序列。例例2 : 表长为表长为11的哈希表中已填有关键字为的哈希表中已填有关键字为17,60,29的记录,散列函数为的记录,散列函数为H(key)=key MOD 11 。 现有第现有第4个记录,其关键字为个记录,其关键字为38,按三种处理冲突的方法,将它,按三种处理冲突的方法,将它填入表中填入表中。(1) H(38)=38 MOD 11=5 冲突冲突 H1=(5+1) MOD 11=6 冲突冲突 H2=(5+2) MOD 11=7 冲突冲突 H3=(5+3) MOD 11=8 不冲突不冲突(

44、2) H(38)=38 MOD 11=5 冲突冲突 H1=(5+1) MOD 11=6 冲突冲突 H2=(5-1) MOD 11=4 不冲突不冲突(3) H(38)=38 MOD 11=5 冲突冲突 设伪随机数序列为设伪随机数序列为9,则,则H1=(5+9) MOD 11=3 不冲突不冲突0 1 2 3 4 5 6 7 8 9 1060 17 29 383838B)链地址法 方法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。例 :已知关键字(19,14,23,1,68,20,84,27,55,11,10,79) 哈希函数: H(key)=key % 13 用链地址法处

45、理冲突201101238910456711121479127556884191023 建立公共溢出区建立公共溢出区方法方法:在基本散列表之外,另外设立一个溢出表保存与:在基本散列表之外,另外设立一个溢出表保存与基本表中记录冲突的所有记录基本表中记录冲突的所有记录。 设散列表长为设散列表长为m m,设立基本散列表,设立基本散列表hashtablemhashtablem,每个分量保存一个记录;溢出表,每个分量保存一个记录;溢出表overtablemovertablem,一旦某个记录的散列地址发生冲突,都,一旦某个记录的散列地址发生冲突,都填入溢出表中填入溢出表中。 例:例: 已知一组关键字已知一组

46、关键字(15, 4, 18, 7, 37, 47) (15, 4, 18, 7, 37, 47) ,散列表长度为,散列表长度为7 7 ,哈希函数为:,哈希函数为:H(key)=key MOD 7H(key)=key MOD 7,用用建立公共溢出区建立公共溢出区法处理冲突法处理冲突。得到的基本表和溢出表。得到的基本表和溢出表如下如下:Hashtable表:表:散列地址散列地址 0 1 2 3 4 5 6 关键字关键字 7 15 37 4 47 overtable表:表:溢出地址溢出地址 0 1 2 3 4 5 6 关键字关键字 18哈希哈希查找找过程程 哈希表的主要目的是用于哈希表的主要目的是用

47、于快速查找,且插入和删除操快速查找,且插入和删除操作都要用到查找作都要用到查找。由于散列由于散列表的特殊组织形式,其查找表的特殊组织形式,其查找有特殊的方法有特殊的方法。 设散列为设散列为HT0m-HT0m-11,散列函数为,散列函数为H(key)H(key),解,解决冲突的方法为决冲突的方法为R(x, i) R(x, i) ,则在散列表上查找定值为则在散列表上查找定值为K K的记录的过程如图的记录的过程如图9-189-18所示所示。给定给定k值值计算计算H(k)此地址为空此地址为空?关键字关键字=k?查找失败查找失败查找成功查找成功按处理冲突按处理冲突方法计算方法计算HiNYYN图图9-18 散列表的查找过程散列表的查找过程Hash查找效率分析装填因子: 查找成功:线性探测再散列随机探测再散列、二次探测链地址Hash查找效率分析装填因子: 查找不成功:线性探测再散列伪随机探测再散列链地址谢谢观赏!谢谢观赏!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号