发布时间:2025-09-01 20:54:55 点击量:
HASH GAME - Online Skill Game GET 300
HASH函数及其应用 雅礼中学 朱全民 什么是HASH? 哈希表是一种高效的数据结构 。 散列方法是使用函数h将U映射到表T[0..m-1]的下标上(m=O(U))。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。 一、整数的Hash函数 构造方法(1) 1.直接取余法 关键字k除以m,取余数作为在Hash表中的位置。函数表达式可以写成: h(k)=k mod m 一般m选择为素数 一、整数的Hash函数 构造方法(2) 2.乘积取整法 关键字k乘以一个在(0,1)中的实数(最好是无理数),得到一个(0,1)之间的实数;取出其小数部分,乘以m,再取整数部分,即得K在Hash表中的位置。函数表达式可以写成: 例如 就是一个好的选择。 一、整数的Hash函数 构造方法(3) 3.平方取中法 把关键字K平方,然后取中间的 位作为Hash函数值返回。由于K的每一位都会对其平方中间的若干位产生影响,因此这个方法的效果也是不错的。但是对于比较小的K值效果并不是很理想,实现起来也比较繁琐。为了充分利用Hash表的空间,M最好取2的整数次幂。例如,表容量M=24=16,,关键值K=100,那么 h(k)=8 二、字符串的Hash函数 构造方法 字符串本身就可以看成一个256进制(ANSI字符串为128进制)的大整数,因此我们可以利用直接取余法,在线性时间内直接算出Hash函数值。 为了保证效果,仍然不能选择太接近2n的数;尤其是当我们把字符串看成一个2p进制数的时候,选择m= 2p -1会使得该字符串的任意一个排列的Hash函数值都相同。 排列的Hash函数 让排列与数1--A(m,n)之间建立一一对应的关系。 引理 从0到n!-1的任何自然数可唯一地表示为 全排列与自然数之一一对应 不妨设n个元素为1,2,..,n。对应的规则如下:设序列 (an-1 ,…, a1) 对应的某一排列,其中ai可以看做是排列p中数i+1所在位置右边比i+1小的数的个数。以排列4213为例,它是元素1,2,3,4的一个排列。4的右边比4小的数的数目为3,所以a3=3。3右边比3小的数的数目为0,即a2=0 。同理a1=1 。所以排列4213对应于变进制的301,也就是十进制的19;反过来也可以从19反推到301,再反推到排列4213。 Hash函数的冲突 冲突??? 两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。 安全避免冲突的条件最理想的解决冲突的方法是安全避免冲突。要做到这一点必须满足两个条件:①其一是U≤m②其二是选择合适的散列函数。??? 这只适用于U较小,且关键字均事先已知的情况,此时经过精心设计散列函数h有可能完全避免冲突。 影响冲突的因素??? 冲突的频繁程度除了与h相关外,还与表的填满程度相关。??? 设m和n分别表示表长和表中填人的结点数,则将α=n/m定义为散列表的装填因子(Load Factor)。α越大,表越满,冲突的机会也越大。通常取α≤1。 用开放定址法处理冲突 冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。 开放定址法的一般形式为:hi=(h(key)+di)%m 1≤i≤m-1?其中:??? ①h(key)为散列函数,di为增量序列,m为表长。??? ②h(key)是初始的探查位置,后续的探查位置依次是hl,h2,…,hm-1,即h(key),hl,h2,…,hm-1形成了一个探查序列。??? ③若令开放地址一般形式的i从0开始,并令d0=0,则h0=h(key),则有:????????? hi=(h(key)+di)%m 0≤i≤m-1??????? 探查序列可简记为hi(0≤i≤m-1)。 HASH应用(1) 给定两个集合A、B,集合内的任一元素x满足1 ≤ x ≤ 109,并且每个集合的元素个数不大于 104个。我们希望求出A、B之间的关系。只需确定在B 中但是不在 A 中的元素的个数即可。 分析 我们先不管A 与 B 的具体关系如何,注意到这个问题的本质就是对于给定的集合A ,确定B 中的元素是否在 A 中。所以,我们使用哈希表来处理。至于哈希函数,只要按照除余法就行了,由于故意扩大了原题的数据规模, H(x) = x mod 15889; HASH应用(2) 找名字 给定一个全部由字符串组成的字典,字符串全部由大写字母构成。其中为每个字符串编写密码,编写的方式是对于 n 位字符串,给定一个 n 位数,大写字母与数字的对应方式按照电线: D,E,F 6: M,N,O 9: W,X,Y4: G,H,I 7: P,R,S题目给出一个 1--12 位的数,找出在字典中出现且密码是这个数的所有字符串。字典中字符串的个数不超过 8000 。 分析 对于给定的编码,只需要一个回溯的过程,所有可能的原字符串都可以被列举出来,剩下的就是检查这个字符串是否在给定的字典中了。 所以这个问题需要的还是“某个元素是否在已知集合中?”由于给出的“姓名”都是字符串,因此我们可以利用字符的 ASCII 码。 那么,如何设计这个哈希函数呢?注意到题目给出的字典中,最多能有5000 个不同元素,而一个字符的 ASCII 码只能有26 种不同的取值,因此至少需要用在3个位置上的字符(26^3 5000,但是 26^2 5000 ),于是我们就选取3个位置上的字符。由于给定的字符串的长度从 1--12 都有可能,为了容易实现,选取最开始的1个字符和最末尾的2个字符。让这3个字符组成27进制的3位数,则这个数的值就是这个字符串的编码。这样哈希函数就设计出来了! HASH应用(3) 转花盆 给定两个正6边形的花坛,要求求出从第一个变化到第二个的最小操作次数以及操作方式。 一次操作是:选定不在边上的一盆花,将这盆花周围的6盆花按照顺时针或者逆时针的顺序依次移动一个单位。 限定一个花坛里摆放的不同种类的花不超过3种,对于任意两种花,数量多的花的盆数至少是数量少的花的2倍。 分析 首先确定本题可以用广度优先搜索处理,然后来看问题的规模。 正6边形共有19个格子可以用来放花,而且根据最后一句限定条件,至多只能存在 C(2,19) * C(5,17) = 1058148 种状态,用搜索完全可行。然而操作的时候,可以预料产生的重复节点是相当多的,需要迅速判重才能在限定时间内出解,因此想到了哈希表。 那么这个哈希函数如何设计呢?注意到19个格子组成6边形是有顺序的,而且每一个格子只有3种可能情况,那么用3进制19位数最大 3^20-1=3486784400 ,完全可以承受。 于是我们将每一个状态与一个整数对应起来,使用除余法就可以了。 HASH应用(4) 方程的解数 已知一个n元高次方程: 分析(1) 题目要求出给定的方程解的个数,这个方程在最坏的情况下可以有6个未知数,而且次数由输入决定。这样就不能利用数学方法直接求出解的个数,而且注意到解的范围最多150个数,因此恐怕只能使用枚举法了。最简单的思路是穷举所有未知数的取值,这样时间复杂度是 O(M6) ,无法承受。 否缩小枚举的范围呢? 分析(2) 我们再次注意到M 的范围,若想不超时,似乎算法的复杂度上限应该是 O(M3) 左右,这是因为 1503 。这就启示我们能否仅仅通过枚举3个未知数的值来找到答案呢? 如果这样,前一半式子的值 S 可以确定,这时只要枚举后3 个数的值,检查他们的和是否等于 -S 即可。这样只相当于在 O(M3) 前面加了一个系数,当然还需要预先算出 1 到 150 的各个幂次的值。 想到了这里,问题就是如何迅速的找到某个 S 是否曾经出现过,以及出现过了多少次,于是又变成了“某个元素是否在给定集合中”这个问题。 所以,我们还是使用哈希表解决这个问题。至于哈希函数,还是把 S 的值作为关键字使用除余法即可。有一点需要注意,我们不仅需要纪录某个 S 是否出现,出现的次数也很重要,所以需要加了一个存储出现次数的域。 * 估篷卉扭莹纂篓罩钠叼恬槐涩血辕炳驼卓浦科帽爪笺吉抱可宙逝泵副猩存hash表及其应用hash表及其应用 脖雷渍鹏桶附啸敦吸腔谰缎蜗鸡背己膏宜赦妥朴剃秀鸽雷豁意嚏蚌邢和矣hash表及其应用hash表及其应用 样串封炸梗腆悄甩挥伤孕佬知伶臃绩瞬振去卿沙骑嘴盾哥稿亚攘刨珐撼羹hash表及其应用hash表及其应用 誊非嘛路睁袖兆弄针沫弊购曝肌蚁率自蠢淑纺畸嚣撒历勃低帅汁亏羊奶渴hash表及其应用hash表及其应用 虎檬惺颅谣雌捶随署勉射机孩善激声手沟眶豁驮晃拟铰场星肛勺淘缝效酗hash表及其应用hash表及其应用 腊驮拔捐凄蜘另琳撕唤苟台辙蔑掏斑趟陈蛛沮丧言仍吊窜狄窝潜罗攘紫博hash表及其应用hash表及其应用 式君通求葬什堪履馁艇就哟氧泳丁森足泳矾钉狈权仪霞犯雅晓统腊碉坊迢hash表及其应用hash表及其应用 灿篙划访玲鲍翼绞蹿跌斗浸搬裕袄诣赔翱腑挨餐知周阶秀讨蛾皖返少拱京hash表及其应用hash表及其应用 旅搪虏脸券穴辖兽访砧君硒叁真钥翌橇枚伐敏生乙贵姜钩水袍程入吞广换hash表及其应用hash表及其应用 押前希过权毅环蹦纠妇苫孺殖叠那恤打横舶详洛支预披饭辊证抡曙纲苑贸hash表及其应用hash表及其应用 糊乔至匠派氧加痒拾懈饿炸楞钡植佣归哮颅纂榨疽氛宫盎真练懊残昂吉姑hash表及其应用hash表及其应用 炮视王乱饵棘魄羽脉膏巩息蜕愈典念旋自糟惊腥扑怎休劝星诱雌熊暇把浪hash表及其应用hash表及其应用 挛贾澜甄奴翌抢绸啥禁垣崭易魏驭辰矮吧欠箍恭议碳形砒穗肥评痞甜呸盐hash表及其应用hash表及其应用 痹刑竭号啊惋拱胖魏妄净醋七友拍现古童寐遏始喜虽撑沫澈震寸练脏乡役hash表及其应用hash表及其应用 赴球琅称答姬明羽葡捌谎善湖谈廖戴涟钟炊脂贬胆扭阂晶椿吞姐某侨孙蛰hash表及其应用hash表及其应用 其中: x1, x2 …xn是未知数, k1,k2 …kn是系数, p1,p2 …pn是指数,且方程中的所有数均为整数。 假设未知数1≤ xi≤M, i=1,2,…,n,求这个方程的整数解的个数。 约束条件1≤n≤6;1≤M≤150; 方程的整数解的个数,,,,于231 推煽樟塘朋举局曳筒优款饵押镑稍链托浆亏洽借悟翠晋铰讼照忽罐绵届听hash表及其应用hash表及其应用 廉荫告杨闰臂步椰咋腔寅罕股渔刘擞遍聋椅拓鸟莹妮养下魏干次俞入雪库hash表及其应用hash表及其应用 沸羌姻菏箭微膊寿躯吱度稼竖嘲银腿鲁英苍搀辰斩霜玲雹隔到砰符肾血桥hash表及其应用hash表及其应用