1、数据结构查找优选数据结构查找Ppt术语:查找(检索)根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素 关键字是记录某个数据项的值,它可以唯一标识 一个记录。次关键字不能唯一的确定一个记录,但能确定表的一个子表。子表的元素个数应远少于表中元素数。为简化问题,将表中元素看成简单的整型数据,理解为关键字部分。8.1 8.1 静态查找表静态查找表 1、顺序表的顺序查找 应用范围:顺序表或线性链表表示的表,表内元素之间无序。查找过程:从表的一端开始逐个进行记录的关键字和给定值的比较。search(st,key,n)/在有n个数据的表st中找key i=n-1;while(i=0&sti!
2、=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,low、high和mid分别指向待查元素所在区间的上界、下界和中点
3、,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(stmid=key)return mid;else if(stmidkey)return b
4、in_search(st,key,l,mid-1);else return bin_search(st,key,mid+1,h)else return-1;平均查找时间1)1(log1)1(log122nnnn3、分块查找数据组织:将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找(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 38 24 48 60 58 74 57 86 5322 48 86
5、1 7 13索引表查38当索引表较大时,可以采用二分查找在数据量极大时,索引可能很多,可考虑建立索引表的索引,即二级索引,原则上索引不超过三级分块查找方法评价2)1(log)2(1)(21212111)1(211ssnASLssnsbisjbASLsbnLLLLASLbssibjbswbwbbs:用折半查找确定所在块:用顺序查找确定所在块查找概率相等,则:记录的个记录,并设表中每个块,每块含的表平均分成若将表长为均查找长度在块中查找元素的平块的平均查找长度查找索引表确定所在其中:由上面的公式,在n一定时,可以通过选择s使ASL尽可能小可以证明,当 时,对于(1)ASL最小。ns 小结:时间:顺
6、序查找最差,二分最好,分块介于两者之间 空间:分块最大,需要增加索引数据的空间 特点:1)顺序查找对表没有特殊要求 2)分块时数据块之间在物理上可不连续。所以可以达到插入、删除数据只涉及对应的块;另外,增加了索引的维护。3)二分查找要求表有序,所以若表的元素的插入与删除很频繁,维持表有序的工作量极大。4)在表不大时,一般直接使用顺序查找。二分查找的C/C+接口stdlib.hvoid*bsearch(void*key,void*base,int nelement,int size,int(*fcmp)(const void*,const void*)其中:fcmp规定:第一个数据小于第二个,返
7、回小于0的数 第一个数据等于第二个,返回0 第一个数据大于第二个,返回大于0的数#include#include cmp(const void*a,const void*b)if(*(int*)a*(int*)b)return-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
8、*pdata)return t;else if(key data)return SearchBST(t-lchild,key);else return SearchBST(t-rchild,key);/SearchBST3、插入算法:首先执行查找算法,找出被插结点的父亲结点。判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。若二叉树为空。则首先单独生成根结点。注意:新插入的结点总是叶子结点。例:将序列:122、99、250、110、300、280 作为二叉排序树的结点的关键字值,生成二叉排序树。12299250300280110void InsertBST(*&t,key)/在
9、二叉排序树中插入查找关键字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-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
10、 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;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(
11、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-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;pq3百货公司:一般客户
12、贵宾会员各县、区负责人与市场部签定协议,协议除其他条款外,要针对货、款一项,由负责人对货、款承担安全责任。以家庭财产担保。走路姿势是动态服务过程中重要的服务技巧之一。行走时脚尖应向着正前方,脚跟先落地,脚掌紧跟落地。走路时要收腹挺胸,两臂自然摆动,节奏快慢适当,展现出一种矫健轻快、从容不迫的动态美。1、构筑物维护10.4 在质量保证期内,由于维修、更换有缺陷或损坏的货物或部件,其保证期将延长,延长时间等于停机时间。1、“招标人”系指阳谷县中医院。_1.8熟知消防设备性能和使用方法。站内动用明火作业须按规定办理动火手续,并制定严密的防范措施。服务人员和顾客之间是一种互动沟通。“镜子原理”说明了顾
13、客与服务人员之间的互动关系:你对镜子笑,镜中人就会笑;你对镜子哭,镜中人就会哭;你伸手打人,他也伸手打人。因此,当顾客出现不礼貌的言行时,服务人员必须忍耐,否则双方争执不下,只会加重恶化事态。如果表现得非常理性、礼让有加,顾客就会平心静气,事态也会发生转变。4.4做好维护保养工作,防止腐蚀,定期送检。5、设备与构筑物改良改善资料;4.4协助站长、班长,做好站内的日常管理工作。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
14、;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-rchild;delete q;else q=p;s=p-lchild;while(s-rchild!=NULL)q=s;s=s-rchild;p-data=s-data;if(q!
15、=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-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
16、(*&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;psqvoid delete(*&p)if(p-rchild=NULL)q=p;p=p-lchild;delete q;else if(p-lchild=NUL
17、L)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;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!=NUL
18、L)q=s;s=s-rchild;p-data=s-data;if(q!=p)q-rchild=s-lchild;else 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-
19、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;p等于q的情况spxqsxqp删除一个结点:DeleteBST(*&t,key
20、)/在根为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);DABCFEG二、平衡二叉树 起因:提高查找速度,避免最坏情况出现。如下图单枝情况的出现。平衡因子(平衡度):结点的平衡因子是结点的左子树的高度减去右子树的高度。(或反之定义)平衡二叉树:每个结点的平衡因子都为 1、1、0 的二叉排序树。或者说每个结点的左右子树的高度最多差1的二叉排序树。1、概念与定义例:014125392
21、863536050171873011-1-1-100000000平衡二叉树028181453963536050173012-1-100001-1 非平衡二叉树0 2、平衡树的平衡方法:在左图所示的平衡树中插入数据为2的结点。插入之后仍应保持平衡分类二叉树的性质不变。14125392863536050171873011-1-1-100000000平衡树1412539286353605017187301-1-1-1000000002112原平衡度为0不平衡点解决:如何用最简单、最有效的办法保持平衡分类二叉树的性质2141253928635360501718730+1+1-1-1-100000000
22、2112原平衡度为0不平衡点Adelson解决思路:不涉及到不平衡点的双亲,即以不平衡点为根的子树的高度应保持不变。新结点插入后,向根回溯找到第一个原平衡因子不为0的结点(如图中9)。新插入的结点和第一个平衡因子不为0的结点之间的结点,其平衡因子原皆为0在调整中,仅涉及前面所提到的最小子树(如:以9为根的子树)仍应保持排序二叉树的性质不变。各县区负责人、市场部要对各销售点,中心药店加强销售情况检查,对销售不佳的,要及时向市场部汇报,采取措施,减小周转量或取消此点,另设销售点。否则,一切责任,后果由县区负责人负责。2.1 统计工作过程一般分为统计设计、统计调查、统计整理、统计分析与统计资料的开发
23、利用五个相关阶段;2.5制定主要容器的维护检修规程和容器改造、检验、修理及报废等技术审查工作。、对凭证进行处理的功能:包括登记记帐凭证、编制记帐凭证;企业应该设计一些在工作中常用的修辞,并对修辞进行标准化。例如有电话打进来,接电话的人员会说“您好,公司,我姓很高兴为您服务”等等。有的公司服务把这种服务规范化、标准化。例如对方找公司的主管,但是主管不在,公司针对这种情况设计了标准的应答;或者是对方的要求本公司无法做到,也设计出标准的回答。修辞的标准化,是互动的对应技巧。设计要符合公司的特色,与公司的业务形象、服务的质量要求紧密相连。这样客户会觉得很满意,对公司有良好的印象。23.履约保证金2、验
24、收合格凭验收单及收款收据退还押金。4.2.4伤亡事故和职业病统计、报告及调查处理的方法;(4)划分营销区域,固定宣传销售点,有以下优点:增加可信度;服务的过程是顾客与服务人员之间产生互动的过程,如果缺少服务人员的参与,服务将难以展开。因此,加强对服务人才的培训,是提高企业整体服务水平,促使顾客满意的必要环节。3、平衡种类分析 左调整(新结点插入在左子树上的调整):1、LL 情况:(插入在结点左子树的左子树上)LL 旋转旋转前后:高度都为 h+11h-10AB1h-12hh-1BRARBLBA0h0h-1h-1BRARBL旋转算法旋转算法void LL_rotate(BBSTNode*a)BBS
25、TNode*b;b=a-Lchild;a-Lchild=b-Rchild;b-Rchild=a;a-Bfactor=b-Bfactor=0;a=b;2、LR 情况:(新插入结点在左子树的右子树上)h-1旋转前后高度仍然是 h+1h-1CB0h-1BLARACRh-2CLh-1-10BLAB1h-102-1ARARCCRCLh-2h-101LR旋转旋转算法旋转算法void LR_rotate(BBSTNode*a)BBSTNode*b,*c ;b=a-Lchild;c=b-Rchild;/*初始化初始化 */a-Lchild=c-Rchild;b-Rchild=c-Lchild;c-Lchild
26、=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;右调整(新结点插入在右子树上进行的调整)1、RR 情况:(插入在的右子树的右子树上)处理方法和 LL对称2、RL 情况:(插入在右子树的左子树上)处理方法与LR对称平衡树建立方法:(1)按二叉排序树插入结点(2)如引起结点平衡因子变为|2|,则确定旋转点,该点是离根最远(或最接近于叶子的点)(3)确定平衡类型后进行平衡处理,平衡后以平衡点为根的子树
27、高不变589162127431011二叉排序树二叉平衡树811122371095614采用B_树和 B+树目的 应文件系统的要求而发展起来的,大量数据存放在外存中,通常存放在硬盘中。由于是海量数据,不可能一次调入内存。因此,要多次访问外存。但硬盘的驱动受机械运动的制约,速度慢。所以,主要矛盾变为减少访外存次数。在 1972 年由 R.Bayer 和 E.Macreight 提出用B_树作为索引组织文件。提高访问速度、减少时间。B_树和B+树一、B_树及其操作1、m 阶B_树定义:m 阶B_树满足或空,或为满足下列性质的m叉树:(1)树中每个结点最多有m 棵子树(2)根结点在不是叶子时,至少有两
28、棵子树(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)所有的叶子结点都出现在同一层上,不带信息(可认为外部结点或失败结点)。例:4阶B_树。除根结点和叶子结点之外,每个结点的子树个数至少为 m/2=2个;结点的关键字个数至少为1。该B_树的深度为4。叶子结点都在第4层上。蓝色代表结点中关键字个数黑色代表结点中关键字第1层第2层第3层第4层1 331
29、182 43 781 111 271 391 993 47 58 64FFFFFFFFFFFF3、B_树的查找:查找过程,类似于二叉树的查找,关键字为key的记录。从根开始在结点中顺序或二分(当 m 较大时)查找,如果 Ki=key 则查找成功,若 KikeyKi+1:顺Ai指向的子树重复查找 若 keyKn;:找顺An指向的子树重复查找 若找到叶子,则查找失败。4、B_树中结点的插入 m代表B_树的阶,插入总发生在最低层 1)插入后关键字个数小于等于 m-1,完成。2)插入后关键字个数等于 m,结点分裂,以中点数据为界一 分为二,中点数据放到双亲结点中。这样就有可能使得 双亲结点的数据个数为
30、m,引起双亲结点的分裂,最坏情况下一直波及到根,引起根的分裂B_树长高。1224 3045 7053902610039506185例:3 阶 B_树的插入操作。最多3棵子树,2个数据;最少2棵子树,1 个数据。所以3阶B_树也称为2-3树。插入位置插入数据:333 1224 3045 70539026100395061857 24 30345 70539026100395061851230324 45 7053902610039506185127 1003032453902639506185127 45 7075、B_树中结点的删除*删除发生在最底层(1)被删关键字所在结点中的关键字数目大于等
31、于 m/2,直接删除。(2)删除后结点中数据为m/2-2,而相邻的左(右)兄弟中数据大于m/2-1,此时左(右兄弟)中最大(小)的数据上移到双亲中,双亲中接(靠)在它后(前)面的数据移到被删数据的结点中。3244553 90371005061 70被删关键字3244561 90371005370(3)其左右兄弟结点中数据都是 m/2-1,此时和左(右)兄弟合 并,合并时连同双亲中相关的关键字。此时,双亲中少了一项,因此又可能引起双亲的合并,最坏一直到根,使B-树降低一层。3 24 45 9010061 7032445 903710061 70删除373 2445 9010061 70*删除不在
32、最底层 在大于被删数据中选最小的代替被删数据,按B_树性质,其位置如下图所示(x是要删除的数据)xy用于代替x的数据问题转换成在最底层的删除作业:试从空树开始,画出按以下次序向2-3树中插入数据的建树过程:20,30,50,52,60,68,70。如果以后删除50和68,画出每一步执行后2-3树的状态。二、B+树 在实际的文件系统中,用的是B+树或其变形。有关性质与操作类似与B_树。1、差异:(1)有n棵子树的结点中有n个关键字(2)所有叶子结点中包含全部关键字信息及对应记录位置信息(3)所有非叶子为索引,只含关键字而且仅有子树中最大或最小的信息。(4)非叶最底层顺序联结,这样可以进行顺序查找
33、59 9715 44 5910 15010203060910对应01的记录2查找过程在 B+树上,既可以进行缩小范围的查 找,也可以进行顺序查找;在进行缩小范围的查找时,不管成功与否,都必须查到叶子结点才能结束;若在结点内查找时,给定值Ki,则应继续在 Ai 所指子树中进行查找3插入和删除的操作类似于B_树进行,即必要时,也需要进行结点的“分裂”或“合并”。8.3 哈希表 前面查找方法共同特点:通过将关键字值与给定值比较,来确定位置。效率取决比较次数。理想的方法是:不需要比较,根据给定值能直接定位记录的存储位置。这样,需要在记录的存储位置与该记录的关键字之间建立一种确定的对应关系,使每个记录的
34、关键字与一个存储位置相对应。例 1949-2000年某地区人口统计表可以按公式确定其人数:y年人数=表y-1948年份人数1 2 3 .51 52194919501951.19992000200021002200.440044201.哈希(也称为Hash、杂凑、散列)基本思想 在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到元素。哈希函数在记录的关键字与记录的存储位置之间建立的一种对应关系。哈希函数是一种映象,是从关键字空间到存储位置空间的一种映象。哈希函数可写成:addr(ai)=h(ki)ai是表中的一个元素addr(ai)是ai的存储位置信息ki
35、是ai的关键字哈希表应用哈希函数,由记录的关键字确定记录在表中的位置信息,并将记录根据此信息放入表中,这样构成的表叫哈希表。哈希查找利用哈希函数进行查找的过程。除了特别简单的应用,在大多数情况下,所构造出的哈希函数是多对一的(非单射函数)。即可能有多个不同的关键字,它们对应的哈希函数值是相同的,这意味着不同记录由哈希函数确定的存储位置是相同的。这种情况被称为冲突。即:若key1不等于key2,而h(key1)=h(key2)Hash查找适合于关键字可能出现的值的集合远远大于实际关键字集合的情形。根据抽屉原理,冲突是不可能完全避免的,所以,要解决:(1)构造一个性能好,冲突少的Hash函数(2)
36、如何解决冲突2、常用的哈希函数(1)直接定址法构造:取关键字或关键字的某个线性函数作哈希地址,即H(key)=key 或 H(key)=akey+b特点:直接定址法所得地址集合与关键字集合大小相等,不会发生冲突 实际中能用这种哈希函数的情况很少。此法仅适合于:地址集合的大小=关键字集合的大小(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
37、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 数字分布近乎随机所以:取任意两位或两位 与另两位的叠加作哈希地址此方法仅适合于:能预先估计出全体关键字的每一位上各种数字出现的频度。(2)数字分析法 构造:对关键字进行分析,取关键字的若干位或其组合作哈希地址。以关键字的平方值的中间几位作为存储地址。求“关键字的平方值”的目的是“扩大差别”,同时平方值的中间各位又能受到整个关键字中各位的影响。(3)平方取中法(4)折叠法构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分
38、割后的几部分低位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。例 关键字为: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间界叠加 此方法适合于:关键字的数字位数特别多,且每一位上数字分布大致均匀情况。(4)折叠法构造:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)做哈希地址。种类移位叠加:将分割后的几部分低位对齐相加间界叠加:从一端沿分割界来回折送,然后对齐相加。(5)除留余数法构造:取关键字被某个不大于哈希表表长m的
39、数p除后所得余数作哈希地址,即H(key)=key%p,pm特点:简单、常用,可与上述几种方法结合使用p的选取很重要;p选的不好,容易产生同义词(6)随机数法构造:取关键字的伪随机函数值作哈希地址,即H(key)=random(key)适于关键字长度不等的情况说明:哈希函数构造不应太复杂 不存在绝对好和坏的函数3 3、冲突解决、冲突解决A)开放定址法开放定址法方法:当冲突发生时,形成一个探查序列;沿此序列逐方法:当冲突发生时,形成一个探查序列;沿此序列逐个地址探查,直到找到一个空位置(开放的地址),将个地址探查,直到找到一个空位置(开放的地址),将发生冲突的记录放到该地址中,即发生冲突的记录放
40、到该地址中,即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=伪随机数序列伪随机数序列例 已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79)哈希函数为:H(key)=key%13,哈希表长为m=16,设每个记录的查找概率相等 用线性探测再散列处理冲突,即Hi=(H(key)+di
41、)%mH(55)=3 冲突-H1=(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)%1
42、6=2H(68)=3H(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线性探测法的特点线性探测法的特点 优点优点:只要散列表未满:只要散列表未满,总能找到一个不冲突的散列地址总能找到一个不冲突的散列地址;缺点缺点:每个产生冲突的记录
43、被散列到离冲突最近的空地址:每个产生冲突的记录被散列到离冲突最近的空地址上上,从而又增加了更多的冲突机会,从而又增加了更多的冲突机会(这种现象称为冲突的这种现象称为冲突的“聚聚集集”)。二次探测法二次探测法增量序列为:增量序列为:di=1,-1,2,-2,3,k (k m/2 )二次探测法的特点二次探测法的特点 优点优点:探测序列跳跃式地散列到整个表中:探测序列跳跃式地散列到整个表中,不易产生,不易产生冲冲突的突的“聚集聚集”现象;现象;缺点缺点:不能保证探测到散列表的所有地址:不能保证探测到散列表的所有地址。伪随机探测法伪随机探测法 增量序列使用一个增量序列使用一个伪随机函数来产生一个伪随机
44、函数来产生一个落在闭区落在闭区间间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 不冲突不冲突(2)H(38)=38 MOD 11=5 冲突冲突 H1=(
45、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 用链地址法处理冲突20110123891045671112147912755688419
46、1023 建立公共溢出区建立公共溢出区方法:在基本散列表之外,另外设立一个溢出表保存与方法:在基本散列表之外,另外设立一个溢出表保存与基本表中记录冲突的所有记录。基本表中记录冲突的所有记录。设散列表长为设散列表长为m,设立基本散列表,设立基本散列表hashtablem,每个分量保存一个记录;溢出表,每个分量保存一个记录;溢出表overtablem,一旦某个记录的散列地址发生冲突,都,一旦某个记录的散列地址发生冲突,都填入溢出表中。填入溢出表中。例:例:已知一组关键字已知一组关键字(15,4,18,7,37,47),散,散列表长度为列表长度为7,哈希函数为:,哈希函数为:H(key)=key M
47、OD 7,用用建建立公共溢出区立公共溢出区法处理冲突法处理冲突。得到的基本表和溢出表如下:。得到的基本表和溢出表如下:Hashtable表:表:散列地址散列地址 0 1 2 3 4 5 6 关键字关键字 7 15 37 4 47 overtable表:表:溢出地址溢出地址 0 1 2 3 4 5 6 关键字关键字 18哈希查找过程哈希查找过程 哈希表的主要目的是用于哈希表的主要目的是用于快速查找,且插入和删除操快速查找,且插入和删除操作都要用到查找。由于散列作都要用到查找。由于散列表的特殊组织形式,其查找表的特殊组织形式,其查找有特殊的方法。有特殊的方法。设散列为设散列为HT0m-1,散列函数为,散列函数为H(key),解,解决冲突的方法为决冲突的方法为R(x,i),则,则在散列表上查找定值为在散列表上查找定值为K的的记录的过程如图记录的过程如图9-18所示。所示。给定给定k值值计算计算H(k)此地址为空此地址为空?关键字关键字=k?查找失败查找失败查找成功查找成功按处理冲突按处理冲突方法计算方法计算HiNYYN图图9-18 散列表的查找过程散列表的查找过程
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。