《数据结构查找.pptx》由会员分享,可在线阅读,更多相关《数据结构查找.pptx(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、术语:查找(检索)根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素 关键字是记录某个数据项的值,它可以唯一标识 一个记录。次关键字不能唯一的确定一个记录,但能确定表的一个子表。子表的元素个数应远少于表中元素数。为简化问题,将表中元素看成简单的整型数据,理解为关键字部分。第1页/共79页8.1 静态查找表 1、顺序表的顺序查找应用范围:顺序表或线性链表表示的表,表内元素之间无序。查找过程:从表的一端开始逐个进行记录的关键字和给定值的比较。search(st,key,n)/在有n个数据的表st中找key i=n-1;while(i=0&sti!=key)i-;if(i0)retur
2、n-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页/共79页顺序查找的平均时间为表长的一半。2、顺序有序表的查找 二分(折半)查找查找过程:每次将待查记录所在区间缩小一半适用条件:采用顺序存储结构的有序表算法实现设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定的待查值初始时
3、,令low=1,high=n,mid=(low+high)/2让k与mid指向的记录比较:若k=rmid,查找成功,结束若krmid,则low=mid+1重复上述操作,直至lowhigh时,查找失败highmidlow第3页/共79页bin_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(stmid=key)return mid;else if(stmidkey)return bin_s
4、earch(st,key,l,mid-1);else return bin_search(st,key,mid+1,h)else return-1;平均查找时间第4页/共79页3、分块查找数据组织:将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找(1)用数组存放待查记录,(2)建立索引表,由每块中最大(小)的关键字及所属块位置的信息组成。第5页/共79页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 38 24 48 60 58 74 57 86 5322 48 861 7 13索引表
5、查38当索引表较大时,可以采用二分查找在数据量极大时,索引可能很多,可考虑建立索引表的索引,即二级索引,原则上索引不超过三级第6页/共79页分块查找方法评价由上面的公式,在n一定时,可以通过选择s使ASL尽可能小可以证明,当 时,对于(1)ASL最小。第7页/共79页小结:时间:顺序查找最差,二分最好,分块介于两者之间 空间:分块最大,需要增加索引数据的空间 特点:1)顺序查找对表没有特殊要求 2)分块时数据块之间在物理上可不连续。所以可以达到插入、删除数据只涉及对应的块;另外,增加了索引的维护。3)二分查找要求表有序,所以若表的元素的插入与删除很频繁,维持表有序的工作量极大。4)在表不大时,
6、一般直接使用顺序查找。第8页/共79页二分查找的C/C+接口void*bsearch(void*key,void*base,int nelement,int size,int(*fcmp)(const void*,const void*)其中:fcmp规定:第一个数据小于第二个,返回小于0的数 第一个数据等于第二个,返回0 第一个数据大于第二个,返回大于0的数第9页/共79页#include#include cmp(const void*a,const void*b)if(*(int*)a*(int*)b)return-1;else if(*(int*)a=*(int*)b)return 0;
7、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);/SearchBST第13页/共79页3、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插
8、结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。例:将序列:122、99、250、110、300、280 作为二叉排序树的结点的关键字值,生成二叉排序树。12299250300280110第14页/共79页void InsertBST(*&t,key)/在二叉排序树中插入查找关键字key if(t=NULL)t=new BiTree;t-lchild=t-rchild=NULL;t-data=key;return;if(keydata)InsertBST(t-lchild,key);else InsertBST(t-
9、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-data=s-data;if(q!=p)q-rchild=s-lchild;else q-lchild=s-lchild;delete s;第21页/共79页
10、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-lchild=s-lchild;delete s;pq第22页/共79页void delete(*&p)if(p-rchild=NULL)q=p;p=p-lchild;delete q;e
11、lse 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;pq第23页/共79页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-
12、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;pq第24页/共79页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;i
13、f(q!=p)q-rchild=s-lchild;else q-lchild=s-lchild;delete s;pq第25页/共79页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-lchild=s-lchild;delete s;p
14、qs第26页/共79页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-lchild=s-lchild;delete s;psq第27页/共79页void delete(*&p)if(p-rchild=NULL)q=p;p=p-lchil
15、d;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;psdq第28页/共79页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
16、;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;dpsdq第29页/共79页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-rchil
17、d;p-data=s-data;if(q!=p)q-rchild=s-lchild;else q-lchild=s-lchild;delete s;dpsdq第30页/共79页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-lchild
18、=s-lchild;delete s;p等于q的情况spxqsxqp第31页/共79页删除一个结点:DeleteBST(*&t,key)/在根为t的排序二叉树中删去值为key的结点 if(!t)return else if(t-data=key)delete(t);else if(t-datakey)DeleteBST(t-lchild,key);else DeleteBST(t-rchild,key);第32页/共79页DABCFEG二、平衡二叉树起因:提高查找速度,避免最坏情况出现。如下图单枝情况的出现。平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)
19、平衡二叉树:每个结点的平衡因子都为 1、1、0 的二叉排序树。或者说每个结点的左右子树的高度最多差1的二叉排序树。1、概念与定义第33页/共79页例:014125392863536050171873011-1-1-100000000平衡二叉树028181453963536050173012-1-100001-1 非平衡二叉树0第34页/共79页2、平衡树的平衡方法:在左图所示的平衡树中插入数据为2的结点。插入之后仍应保持平衡分类二叉树的性质不变。14125392863536050171873011-1-1-100000000平衡树1412539286353605017187301-1-1-10
20、00000002112原平衡度为0不平衡点解决:如何用最简单、最有效的办法保持平衡分类二叉树的性质2第35页/共79页141253928635360501718730+1+1-1-1-1000000002112原平衡度为0不平衡点Adelson解决思路:不涉及到不平衡点的双亲,即以不平衡点为根的子树的高度应保持不变。新结点插入后,向根回溯找到第一个原平衡因子不为0的结点(如图中9)。新插入的结点和第一个平衡因子不为0的结点之间的结点,其平衡因子原皆为0在调整中,仅涉及前面所提到的最小子树(如:以9为根的子树)仍应保持排序二叉树的性质不变。第36页/共79页3、平衡种类分析 左调整(新结点插入在
21、左子树上的调整):1、LL 情况:(插入在结点左子树的左子树上)LL 旋转旋转前后:高度都为 h+11h-10AB1h-12hh-1BRARBLBA0h0h-1h-1BRARBL第37页/共79页旋转算法旋转算法void LL_rotate(BBSTNode*a)BBSTNode*b;b=a-Lchild;a-Lchild=b-Rchild;b-Rchild=a;a-Bfactor=b-Bfactor=0;a=b;第38页/共79页2、LR 情况:(新插入结点在左子树的右子树上)h-1旋转前后高度仍然是 h+1h-1CB0h-1BLARACRh-2CLh-1-10BLAB1h-102-1ARA
22、RCCRCLh-2h-101LR旋转第39页/共79页旋转算法旋转算法void LR_rotate(BBSTNode*a)BBSTNode*b,*c ;b=a-Lchild;c=b-Rchild;/*初始化 */a-Lchild=c-Rchild;b-Rchild=c-Lchild;c-Lchild=b;c-Rchild=a;if(c-Bfactor=1)a-Bfactor=-1;b-Bfactor=0;else if(c-Bfactor=0)a-Bfactor=b-Bfactor=0;else a-Bfactor=0;b-Bfactor=1;第40页/共79页右调整(新结点插入在右子树上进行
23、的调整)1、RR 情况:(插入在的右子树的右子树上)处理方法和 LL对称2、RL 情况:(插入在右子树的左子树上)处理方法与LR对称平衡树建立方法:(1)按二叉排序树插入结点(2)如引起结点平衡因子变为|2|,则确定旋转点,该点是离根最远(或最接近于叶子的点)(3)确定平衡类型后进行平衡处理,平衡后以平衡点为根的子树高不变第41页/共79页589162127431011二叉排序树第42页/共79页二叉平衡树811122371095614第43页/共79页采用B_树和 B+树目的 应文件系统的要求而发展起来的,大量数据存放在外存中,通常存放在硬盘中。由于是海量数据,不可能一次调入内存。因此,要多
24、次访问外存。但硬盘的驱动受机械运动的制约,速度慢。所以,主要矛盾变为减少访外存次数。在 1972 年由 R.Bayer 和 E.Macreight 提出用B_树作为索引组织文件。提高访问速度、减少时间。8.2.2 B_树和B+树一、B_树及其操作第44页/共79页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:关键字的个数
25、,ki(i=1,2,n)为关键字,且满足KiKi+1,,Ai(i=0,1,.n)为指向子树的指针。(5)所有的叶子结点都出现在同一层上,不带信息(可认为外部结点或失败结点)。第45页/共79页例:4阶B_树。除根结点和叶子结点之外,每个结点的子树个数至少为 m/2=2个;结点的关键字个数至少为1。该B_树的深度为4。叶子结点都在第4层上。蓝色代表结点中关键字个数黑色代表结点中关键字第1层第2层第3层第4层1 331 182 43 781 111 271 391 993 47 58 64FFFFFFFFFFFF第46页/共79页3、B_树的查找:查找过程,类似于二叉树的查找,关键字为key的记录
26、。从根开始在结点中顺序或二分(当 m 较大时)查找,如果 Ki=key 则查找成功,若 KikeyKi+1:顺Ai指向的子树重复查找 若 keyKn;:找顺An指向的子树重复查找 若找到叶子,则查找失败。第47页/共79页4、B_树中结点的插入 m代表B_树的阶,插入总发生在最低层 1)插入后关键字个数小于等于 m-1,完成。2)插入后关键字个数等于 m,结点分裂,以中点数据为界一 分为二,中点数据放到双亲结点中。这样就有可能使得 双亲结点的数据个数为m,引起双亲结点的分裂,最坏情况下一直波及到根,引起根的分裂B_树长高。1224 30457053902610039506185例:3 阶 B_
27、树的插入操作。最多3棵子树,2个数据;最少2棵子树,1个数据。所以3阶B_树也称为2-3树。插入位置插入数据:33第48页/共79页31224304570539026100395061857243034570539026100395061851230324457053902610039506185127100303245390263950618512745707第49页/共79页5、B_树中结点的删除*删除发生在最底层(1)被删关键字所在结点中的关键字数目大于等于 m/2,直接删除。(2)删除后结点中数据为m/2-2,而相邻的左(右)兄弟中数据大于m/2-1,此时左(右兄弟)中最大(小)的数据
28、上移到双亲中,双亲中接(靠)在它后(前)面的数据移到被删数据的结点中。32445539037100506170被删关键字324456190371005370第50页/共79页(3)其左右兄弟结点中数据都是 m/2-1,此时和左(右)兄弟合 并,合并时连同双亲中相关的关键字。此时,双亲中少了一项,因此又可能引起双亲的合并,最坏一直到根,使B-树降低一层。324459010061703244590371006170删除3732445901006170第51页/共79页*删除不在最底层 在大于被删数据中选最小的代替被删数据,按B_树性质,其位置如下图所示(x是要删除的数据)xy用于代替x的数据问题转
29、换成在最底层的删除第52页/共79页作业:试从空树开始,画出按以下次序向2-3树中插入数据的建树过程:20,30,50,52,60,68,70。如果以后删除50和68,画出每一步执行后2-3树的状态。第53页/共79页二、B+树 在实际的文件系统中,用的是B+树或其变形。有关性质与操作类似与B_树。1、差异:(1)有n棵子树的结点中有n个关键字(2)所有叶子结点中包含全部关键字信息及对应记录位置信息(3)所有非叶子为索引,只含关键字而且仅有子树中最大或最小的信息。(4)非叶最底层顺序联结,这样可以进行顺序查找第54页/共79页59 9715 44 5910 15010203060910对应01
30、的记录第55页/共79页2查找过程在 B+树上,既可以进行缩小范围的查 找,也可以进行顺序查找;在进行缩小范围的查找时,不管成功与否,都必须查到叶子结点才能结束;若在结点内查找时,给定值Ki,则应继续在 Ai 所指子树中进行查找3插入和删除的操作类似于B_树进行,即必要时,也需要进行结点的“分裂”或“合并”。第56页/共79页8.3 哈希表 前面查找方法共同特点:通过将关键字值与给定值比较,来确定位置。效率取决比较次数。理想的方法是:不需要比较,根据给定值能直接定位记录的存储位置。这样,需要在记录的存储位置与该记录的关键字之间建立一种确定的对应关系,使每个记录的关键字与一个存储位置相对应。例
31、1949-2000年某地区人口统计表可以按公式确定其人数:y年人数=表y-1948年份人数1 2 3 .51 52194919501951.19992000200021002200.44004420第57页/共79页1.哈希(也称为Hash、杂凑、散列)基本思想 在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到元素。哈希函数在记录的关键字与记录的存储位置之间建立的一种对应关系。哈希函数是一种映象,是从关键字空间到存储位置空间的一种映象。哈希函数可写成:addr(ai)=h(ki)ai是表中的一个元素addr(ai)是ai的存储位置信息ki是ai的关键字
32、第58页/共79页哈希表应用哈希函数,由记录的关键字确定记录在表中的位置信息,并将记录根据此信息放入表中,这样构成的表叫哈希表。哈希查找利用哈希函数进行查找的过程。除了特别简单的应用,在大多数情况下,所构造出的哈希函数是多对一的(非单射函数)。即可能有多个不同的关键字,它们对应的哈希函数值是相同的,这意味着不同记录由哈希函数确定的存储位置是相同的。这种情况被称为冲突。即:若key1不等于key2,而h(key1)=h(key2)Hash查找适合于关键字可能出现的值的集合远远大于实际关键字集合的情形。根据抽屉原理,冲突是不可能完全避免的,所以,要解决:(1)构造一个性能好,冲突少的Hash函数(
33、2)如何解决冲突第59页/共79页2、常用的哈希函数(1)直接定址法构造:取关键字或关键字的某个线性函数作哈希地址,即H(key)=key 或 H(key)=akey+b特点:直接定址法所得地址集合与关键字集合大小相等,不会发生冲突 实际中能用这种哈希函数的情况很少。此法仅适合于:地址集合的大小=关键字集合的大小第60页/共79页(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
34、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 数字分布近乎随机所以:取任意两位或两位 与另两位的叠加作哈希地址第61页/共79页此方法仅适合于:能预先估计出全体关键字的每一位上各种数字出现的频度。(2)数字分析法 构造:对关键字进行分析,取关键字的若干位或其组合作哈希地址。第62页/共79页 以关键字的平方值的中间几位作为存储地址。求“关键字的平方值”的目的是“扩大差别”,同时平方值的中间各位又能受到整个关键字中各位的影响。(3)平方取中法第63页/共79页(4)折叠法构造:
35、将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分割后的几部分低位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。例 关键字为:0442205864,哈希地址位数为45 8 6 44 2 2 00 41 0 0 8 8H(key)=0088移位叠加5 8 6 40 2 2 40 4 6 0 9 2H(key)=6092间界叠加第64页/共79页 此方法适合于:关键字的数字位数特别多,且每一位上数字分布大致均匀情况。(4)折叠法构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分割后的几部分低
36、位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。第65页/共79页(5)除留余数法构造:取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(key)=key%p,pm特点:简单、常用,可与上述几种方法结合使用p的选取很重要;p选的不好,容易产生同义词(6)随机数法构造:取关键字的伪随机函数值作哈希地址,即H(key)=random(key)适于关键字长度不等的情况说明:哈希函数构造不应太复杂 不存在绝对好和坏的函数第66页/共79页3、冲突解决A)开放定址法方法:当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放
37、到该地址中,即Hi=(H(key)+di)%m,i=1,2,k(k m-1)其中:H(key)哈希函数 m哈希表表长 di增量序列分类线性探测再散列:di=1,2,3,m-1二次探测再散列:di=1,-1,2,-2,3,k(k m/2)伪随机探测再散列:di=伪随机数序列第67页/共79页例 已知一组关键字(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=(3+1)%16=4 冲突-H2=(3+2)%
38、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(20)=7H(84)=6 冲突-H1=(6+1)%16=
39、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第68页/共79页开放定址法的几个问题 1)删除:只能作标记,不能真正删除 2)溢出 3)聚集问题12345678x第69页/共79页线性探测法的特点 优点:只要散列表未满,总能找到一个不冲突的散列地址;缺点:每个产生冲突的记录被散列到离冲突最近的空地址上,从而又增加了更多的冲突机会(这种现象称为冲突的“聚集”)。二次探测法二次探测法增量
40、序列为:di=1,-1,2,-2,3,k (k m/2)第70页/共79页二次探测法的特点 优点:探测序列跳跃式地散列到整个表中,不易产生冲突的“聚集”现象;缺点:不能保证探测到散列表的所有地址。第71页/共79页 伪随机探测法伪随机探测法 增量序列使用一个增量序列使用一个伪随机函数来随机函数来产生一个生一个落在落在闭区区间1,m-1的的随机序列随机序列。例例2:表表长为11的哈希表中已填有关的哈希表中已填有关键字字为17,60,29的的记录,散列函数,散列函数为H(key)=key MOD 11。现有第有第4个个记录,其关,其关键字字为38,按三种,按三种处理冲突的方法,将它理冲突的方法,将
41、它填入表中填入表中。(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 不冲突不冲突第72页/共79页(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 383838第73页/共79页B)链地址法
42、 方法:将所有关键字为同义词的记录存储在一个单链表中,并用一维数组存放头指针。例 :已知关键字(19,14,23,1,68,20,84,27,55,11,10,79)哈希函数:H(key)=key%13 用链地址法处理冲突201101238910456711121479127556884191023第74页/共79页 建立公共溢出区建立公共溢出区方法:在基本散列表之外,另外设立一个溢出表保存与基本表中记录冲突的所有记录。设散列表长为m,设立基本散列表hashtablem,每个分量保存一个记录;溢出表overtablem,一旦某个记录的散列地址发生冲突,都填入溢出表中。例:已知一组关键字(15,
43、4,18,7,37,47),散列表长度为7,哈希函数为:H(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第75页/共79页哈希查找过程哈希查找过程 哈希表的主要目的是用于快速查找,且插入和删除操作都要用到查找。由于散列表的特殊组织形式,其查找有特殊的方法。设散列为HT0m-1,散列函数为H(key),解决冲突的方法为R(x,i),则在散列表上查找定值为K的记录的过程如图9-18所示。给定定k值计算算H(k)此地址此地址为空空?关关键字字=k?查找失找失败查找成功找成功按按处理冲突理冲突方法方法计算算HiNYYN图9-18 散列表的散列表的查找找过程程第76页/共79页Hash查找效率分析装填因子:查找成功:线性探测再散列随机探测再散列、二次探测链地址第77页/共79页Hash查找效率分析装填因子:查找不成功:线性探测再散列伪随机探测再散列链地址第78页/共79页感谢您的观看!第79页/共79页
限制150内