软哈希娱乐件技术基础概论第6章查找ppt
哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏
* 哈希表构造与查找 1.哈希函数的构造方法 1)直接定址法 Hash(key)=a×key+b (a,b为常数) 即取关键字key的某个线性函数值作为哈希地址。这类函数计算简单且一一对应,不会产生冲突。但由于各关键字在其集合中的分布是离散的,所以计算出来的哈希地址也是离散的,这常常造成存储空间的浪费。只能通过调整a、b值使得浪费尽可能减小。实际问题中已很少采用这类哈希函数。 * 哈希表构造与查找 【例如】 关键字集合序列为{50, 100, 200, 350, 400, 500},选取哈希函数为Hash(key)=key/50(a=50,b=0),则哈希表存储如表6.2所示。 * 哈希表构造与查找 1.哈希函数的构造方法 2)除留余数法 Hash(key)=key%p (p为整数) 即取关键字key除以p后的余数作为哈希地址,该方法用求余运算符“%”实现。使用除留余数法的关键是选取合适的p,它决定了所生成哈希表的优劣。若哈希表表长为m,则要求p≤m且接近m或等于m。一般选取的p为质数,以便尽可能减少冲突的发生。 * 哈希表构造与查找 【例如】 关键字集合序列为{8, 13, 28, 11, 23},选取的质数p=7,哈希函数为Hash(key)=key%7,则哈希表存储如表6.3所示。 * 哈希表构造与查找 1.哈希函数的构造方法 3)数字分析法 如果所有关键字都是以d为基(即进制)的数,各关键字的位数又较多,且事先知道所有关键字在各位的分布情况,则可通过对这些关键字的分析,选取其中几个数字分布较为均匀的位来构造哈希函数。该方法使用的前提是必须事先知道关键字的集合。 * 哈希表构造与查找 【例如】 已知以10为基的各关键字如表6.4所示,并假定哈希表的表长为1000,则可选取3位数字作为哈希地址。分析表6.4的各关键字可知,关键字的第①、②、④、⑥及⑧位上的数字分布是不均匀的,故此只考虑③、⑤、⑦位上的数字,这样就得出最后一列的哈希地址,这些哈希地址分布比较均匀因而造成冲突的概率也就低。 * 哈希表构造与查找 * 哈希表构造与查找 1.哈希函数的构造方法 4)平方取中法 如果事先无法知道所有关键字在各权值位上的分布情况,就不能利用数字分析法来求哈希函数。这时可以采用平方取中法来构造哈希函数。采用该方法构造哈希函数的原则是:先计算关键字值的平方,然后有目的地选取平方结果中的中间若干位来作为哈希地址。 * 哈希表构造与查找 【例如】 关键字集合序列为{128,328,228,528},由于各关键字的后两位均是28,故数字在各位上的分布是不均匀的,所以采用平方取中法,平方后的结果及所求的哈希地址如表6.5所示,该哈希地址是对关键字平方后由右往左数的第5、4、3位,因为这3位是均匀分布的。 * 哈希表构造与查找 1.哈希函数的构造方法 5)折叠法 当关键字的位数过长时,采用平方取中法就会花费过多的计算时间。在这种情况下可采用折叠法,即根据哈希表地址空间的大小,将关键字分割成相等的几个部分(最后一部分位数可能短些),然后将这几部分进行叠加并舍弃最高进位,且叠加的结果就作为该关键字的哈希地址。 * 哈希表构造与查找 【例如】 一个关键字为1357246890,设哈希表长度为10000,则可将关键字由低向高位分割成3部分,每一部分占4位(最高部分占2位),然后分别进行移位叠加和折叠叠加,其计算过程和结果如图6.7所示。 图6.7 用折叠法求哈希函数 * 哈希表构造与查找 2.哈希表处理冲突的方法 在一般情况下,哈希函数是一个从较大的关键字值空间到较小的哈希表存储空间的压缩映像函数,这就不可避免地会发生冲突。因此,如何处理冲突是哈希方法的另一个关键问题。 我们仅对采用一维数组存储的散列表进行讨论。 * 哈希表构造与查找 2.哈希表处理冲突的方法 基本思想 对表长为m的散列表,在需要时为关键字key生成一个散列地址序列d0,d1,…,dm-1;其中,d0=Hash(key)是key的散列地址,但所有的di(0<i<m)是key的后继散列地址。当向散列表中插入关键字为key的记录时,若存储位置d0已被具有其他关键字的记录占用,则按d1,d2,…,dm-1的序列依次探测,并将找到的第一个空闲地址作为关键字key的记录存放位置;若key的所有后继散列地址都被占用,则表明该散列表已满(溢出)。 * 哈希表构造与查找 2.哈希表处理冲突的方法 常见的构造方法 1)开放定址法 Hi=(Hash(key)+di)%m (1≤i<m) 其中,Hash(key)为哈希函数,m为散列表的长度;di为增量序列,它可以有三种取法:①di=1,2,…,m-1,称为线,称为二次探测法;③di为伪随机序列,称为随机探测法。 * 哈希表构造与查找 2.哈希表处理冲突的方法 【例6.3】 已知哈希函数为Hash(key)=key%11,散列表情况如表6.6所示。现需将42插入该表,请给出在线的过程说明。 * 哈希表构造与查找 2.哈希表处理冲突的方法 【解】 当插入42时,因Hash(42)=42%11=9,而地址9已被20占用,故向后探测,即 Hash(42)=(Hash(42)+1)%11=(9+1)%11=10 而地址10已被32占用,所以继续向后探测,即 Hash(42)=(Hash(42)+2)%11=(9+2)%11=0 而地址0又被22占用,因此继续向后探测,直到地址6为空时才将42放入地址6中。 注意:在探测过程中,关键字42和20是同义词,因此它们必然发生冲突;但42与32不是同义词,本来它们之间是不会发生冲突的,但由于关键字42初始的散列地址被20占用,故42只能探测后继的存储地址,这样42就与32发生了冲突。这种非同义词为争夺同一存储位置而发生冲突的现象就是我们所说的“堆积”。 * 哈希表构造与查找 2.哈希表处理冲突的方法 线性探测法思路清晰且算法简单,但也存在着以下缺点。 (1)溢出处理需另编程序,一般可另设一个溢出表专门用来存放在散列表中存放不下的记录。 (2)按线性探测法建立起来的散列表是不能进行删除操作的,若进行删除操作,则必须对该存放位置进行特殊标记;否则,如果简单地在散列表上直接删除一个记录,就会因该位置为空而造成线性探测序列的中断,从而无法再查找与被删除记录具有相同哈希函数值的后继记录。如对表6.6来说,当删去表中的关键字20后,我们就无法查找刚放入表中的关键字42了。 (3)线性探测法很容易产生堆积现象。当哈希函数不能把关键字很均匀地散列到散列表中时尤其容易产生堆积现象。产生堆积现象后增加了探测次数,降低了查找效率。如例6.3中插入42的过程即是如此。 * 哈希表构造与查找 2.哈希表处理冲突的方法 2)再散列(哈希)法 再散列法的思想很简单,即在发生冲突时用不同的哈希函数再求得新的散列地址,直到不发生冲突为止,即散列地址序列d0,d1,…,di的计算如下: di=Hashi(key) (i=1,2,…) 其中,Hashi(key)表示不同的哈希函数。 * 哈希表构造与查找 2.哈希表处理冲突的方法 【例6.4】 已知Hash1(key)=key%13,Hash2(key)=key%11,散列表情况如表6.7所示。现需将关键字42插入该表,请给出在再散列法方式下插入42的过程说明。 * 哈希表构造与查找 2.哈希表处理冲突的方法 【解】 当插入42时,因Hash1(42)=42%13=3,而地址3已被85占用,故用Hash2继续探测;Hash2(42)=42%11=9,而地址9为空,故将42放入地址9。 * 哈希表构造与查找 3.哈希表的查找 哈希表的查找过程与构造哈希表的过程基本一致,即给定关键字key值并根据构造哈希表时设定的哈希函数求得其存储地址。若哈希表中此存储地址中没有记录,则查找失败;否则将该地址中的关键字与key比较,若相等则查找成功,反之,则根据构造哈希表时设定的解决冲突方法寻找下一个哈希地址,直到查找成功或查找到的哈希地址中无记录(即查找失败)为止。 * * * 第6章 查找 * 第六章 查 找 查找是使用最广泛的操作之一,为了得到某些信息需经常进行查找。例如,学生在学习中用英文字典查找单词,公路交通部门每天花费大量时间查找各种指定牌号的车辆,游客查找某个城市的景点、交通、街道和饮食情况,等等。特别是在互联网上查找大量的所需信息,已经成为我们日常生活的一部分。本章介绍查找的基本概念,以及实现顺序查找、折半查找、分块查找、二叉排序树上的查找和哈希查找的算法。 * 本章内容提要: 查找的基本概念 静态查找表 动态查找表 第六章 查 找 * 6.1 查找的基本概念 查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到则查找成功,返回该记录的信息或该记录在表中的位置;反之,查找失败,返回相关的提示信息。 * 用于查找的表和文件统称为查找表,它是以集合为其逻辑结构、以查找为目的的数据结构。由于集合中的记录之间没有任何“关系”,所以查找表的实现也不受“关系”约束,而是根据实际应用中对查找的具体要求来组织查找表,以便高效率的实现查找。 * 通常把查找过程中对关键字的比较次数作为衡量一个查找算法效率优劣的标准,也称为平均查找长度,通常用ASL表示。对一个含有n个记录的表,平均查找长度ASL定义为 其中,n是记录的个数,pi是查找第i个记录的概率。若不特别声明,均认为对每个记录的查找概率是相等的,即 (1≤i≤n)。ci是查找第i个记录所需进行的比较次数。 * 6.2 静态查找表 顺序查找 有序表的查找 * 顺序查找 查找与数据的存储结构有关。我们以顺序表作为存储结构来实现顺序查找。定义顺序表类型如下: typedef struct { KeyType key; //KeyType为关键字key的 数据类型 InfoType otherdata; //其他数据 }SeqList; ? 在此,KeyType为虚拟的数据类型,在实际实现中可为int、char等类型;InfoType也是其他数据的虚拟类型,而otherdata则代表虚拟的其他数据,在实际实现中可根据需要设置为一个或多个真实的类型和真实的数据。 * 顺序查找 顺序查找又称线性查找,是最简单、最基本的查找方法。顺序查找的方法为:从表的一端开始,向另一端逐个按给定值k与表中记录的关键字key值进行比较。若找到与k值相同的记录关键字key值,则查找成功,并给出记录在表中的位置;若整个表扫描完仍未找到与k值相同的记录关键字key值,则查找失败,给出失败的信息。 顺序查找的算法如下: int SeqSearch(SeqList R[], int n, int k) //顺序查找 { int i=n; R[0].key=k; //R[0].key为查找不成功的监视哨 while(R[i].key!=k) //由表尾向表头方向查找 i--; return i; //查找成功返回找到的位置值否则返回0值 } ? * 顺序查找 根据上述算法,对n个记录的顺序表采用由后向前比较方式。若给定值k与表中第i个元素的关键字(即R[i].key)值相等,即定位于第i个记录时,由图6.1可知,共对n-i+1个记录的关键字进行了比较,即ci=n-i+1,则顺序查找成功时的平均查找长度为 图6.1 由后向前比较到第i个记录时比较次数示意 * 顺序查找 由于上述算法中的基本工作就是关键字比较,因此查找长度的量级就是查找算法的时间复杂度,即为O(n)。 注意:如果采用的是由前向后进行查找,则ci=i,故查找成功时的平均查找长度仍为 ,只不过要在while循环中增加判断条件“i=n”。 顺序查找的缺点是当n很大时,平均查找长度较大、效率低;优点是对表中记录的存储没有过多的要求。 * 6.2 静态查找表 顺序查找 有序表的查找 * 有序表的查找 1. 折半查找 折半查找也称二分查找,它是一种效率较高的查找方法。折半查找要求查找表必须是顺序存储结构且表中记录按关键字有序排列(即为有序表)。 折半查找的方法是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功。否则,由这个中间记录位置把有序表划分为两个子表(不包括该中间记录),若给定值小于中间记录的关键字,则在中间记录左半区的子表去继续查找;若给定值大于中间记录的关键字,则在中间记录右半区的子表去继续查找。不断重复上述查找过程,直到查找成功,或者所查找的子表区域无记录而查找失败。 * 有序表的查找 折半查找算法如下: int BinSearch(SeqList R[], int n, int k) { int low=0, high=n-1, mid; while(low=high) { //查找区间最左记录的位置low小于等于最右记录的位置high mid=(low+high)/2; //mid取该查找区间的中间记录位置 if(R[mid].key==k) //当中间记录的关键字与k相等时 return mid; //查找成功 else if(R[mid].keyk) high=mid-1; //继续在R[low]~R[mid-1]中查找 else low=mid+1; //继续在R[mid+1]~R[high]中查找 } return -1; //查找失败 } 算法中,顺序表中的n个记录按关键字升序的方式存放于一维数组R[0]~R[n-1]中。 * 有序表的查找 我们以树高为k的满二叉树(即n=2k-1)来讨论折半查找的平均查找长度,在等概率(即 )的条件下,折半查找成功的平均查找长度为 * 有序表的查找 由 和 ,得 当n很大时,ASL≈log2(n+1)-1。因此,折半查找的时间效率为O(log2n)。由于log2(n+1)=k,故ASL≈k-1,即折半查找成功的平均查找长度约为折半查找判定树的深度减1。可见,折半查找比顺序查找的平均查找效率高,但折半查找只适用于顺序存储结构。 * 有序表的查找 2. 分块查找 分块查找又称为索引顺序查找,它是将顺序查找与折半查找相结合的一种查找方法,在一定程度上解决了顺序查找速度慢以及折半查找要求数据元素有序排列的问题。 在分块查找中,将表分为若干块且每一块中关键字不要求有序,但块与块之间的关键字是有序的,即后一块中所有记录的关键字均大于前一块中的最大关键字。此外,还为这些块建立了一个索引表且索引表项按关键字有序(为递增有序表),它存放各块记录的起始存放位置以及该块所有记录中的最大关键字值。 * 有序表的查找 分块查找存储结构示意 * 有序表的查找 分块查找过程分两步进行: 第一步,在索引表中确定待查记录在哪一块,因为索引表有序,故可采用折半查找或顺序查找; 第二步,在已确定的块中进行顺序查找。 由于分块查找实际上是两次查找过程,因此整个分块的平均查找长度应该是两次查找的平均查找长度(索引查找与块内查找)之和,也即分块查找的平均查找长度为查找索引表的平均查找长度Lb与块内查找的平均查找长度Ls之和: * 有序表的查找 前面已经介绍了三种静态查找表: 从表的结构上看,顺序查找对表有序、无序均适用,折半查找仅适用于有序表,而分块查找则要求表分块后“块间有序,块内可以无序”。 从表的存储结构来看,顺序查找和分块查找对于表的顺序和链式存储结构均适用,而折半查找只适用于顺序存储结构。就平均查找长度而言,折半查找最小,分块查找次之,而顺序查找最大。 * 6.3 动态查找表 二叉排序树查找 哈希表构造与查找 * 二叉排序树查找 概念 二叉排序树可以看作是一个有序表,即在二叉排序树中左子树上所有结点的关键字均小于根结点的关键字,而右子树所有结点的关键字均大于或等于根结点的关键字,因此二叉排序树上的查找与折半查找类似。 * 二叉排序树查找 查找过程 二叉排序树的查找过程是: (1)若二叉排序树非空,则将给定值k与根结点关键字值比较,若相等,则查找成功; (2)若不等,则当k值小于根结点关键字时到根的左子树去继续查找,否则到根的右子树去继续查找。 二叉排序树的这种查找过程显然是一个递归过程。 * 二叉排序树查找 二叉排序树查找算法 BSTree *BSTSearch(BSTree *t, KeyType k) //二叉排序树查找 { //在指针t所指的二叉排序树中查找关键字值为k的结点 while(t!=NULL) if(k==t-key) return t; //k等于根结点*t的关键字则查找成功,返回指针t值 else if(kt-key ) t=t-lchild; //k小于根结点*t的关键字值则到t的左子树查找 else t=t-rchild; //k大于根结点*t的关键字值则到t的右子树查找 return NULL; //查找失败返回空指针值 } * 二叉排序树查找 在二叉排序树上进行查找,若查找成功,则恰好走了一条从根结点到该结点的路径,即和给定值比较的关键字个数等于该结点所在的层数(或路径长度加1);若查找不成功,则是从根结点出发走了一条从根结点到某叶结点的左、右指针为止的路径,因为只有当指针为空时才知道查找失败。因此,查找成功时,二叉排序树与给定值比较的关键字个数不超过二叉排序树的深度。 * 二叉排序树查找 【例6.2】 一棵二叉排序树如图6.5所示,求查找成功的ASL和查找失败的ASL。 【解】 查找成功时是从根结点出发走了一条从根结点到待查结点的路径;若查找不成功,则是从根结点出发走了一条从根结点到某叶结点的路径,当到达叶结点时,还要继续沿叶结点的左指针或右指针再探查一次。因此,对图6.5所示的二叉排序树查找成功的ASL为树中各结点的层数之和除以树的结点个数n[见图6.6(a)];而查找失败时的ASL为图6.6(b)中空白结点(每个空白结点代表一个空指针)的层数之和除以空白结点的个数m。 * 二叉排序树查找 图6.5 二叉排序树示意 图6.6 查找成功和查找失败的二叉排序树示意 * 6.3 动态查找表 二叉排序树查找 哈希表构造与查找 * 哈希表构造与查找 基本思想 哈希表查找方法的基本思想是:在记录的关键字(记为key)和记录的存储位置(记为address)之间找出关系函数f,使得每个关键字能够被映射到一个存储位置上,即address=f(key)。当存储一个记录时,按照记录的关键字key通过函数f计算出它的存储位置address,并将该记录存入这个位置。这样,当查找这个记录时,就可根据给定值key以及函数f,通过f(key)计算求得该记录的存储位置,即可直接由该存储位置访问这个记录了。 * 哈希表构造与查找 上述方法中,函数f被称为哈希函数或散列函数,通常记为Hash(key),由哈希函数及关键字值计算出来的哈希函数值(即存储地址)称为哈希地址,通过构造哈希函数的过程得到一张关键字与哈希地址之间的关系表则称为哈希表或散列表。因此,哈希表可以用一维数组实现,数组元素用于存储包含关键字的记录;数组元素的下标就是该记录的哈希地址,当需要查找某关键字时,只要它在哈希表中就可以通过哈希函数确定它在表中(数组中)的存储位置。 * 哈希表构造与查找 【例如】 有一个由整数组成的关键字集合序列为{27, 11, 3, 56, 15, 65, 33},要求将该关键字序列存储到下标为0~6的一维数组中,则选取Hash(key)=key%7即可构造出如表6.1所示的哈希表。 * *
苏教版二年级下册数学教学课件-第六单元 两、三位数的加法和减法-第12课时 复习课.ppt
(参)江苏省2024年普通高校招生考试方案及录取办法调查问卷.docx
原创力文档创建于2008年,本站为文档C2C交易模式,即用户上传的文档直接分享给其他用户(可下载、阅读),本站只是中间服务平台,本站所有文档下载所得的收益归上传人所有。原创力文档是网络服务平台方,若您的权利被侵害,请发链接和相关诉求至 电线) ,上传者