




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HASH函数及其应用 雅礼朱全民 问题一 读入n个正整数 每个数小于109查询某个数是否在这n个数中出现一共查询m次n 100000m 100000 in txt5 5个数816353 询问3次369 out txtYESYESNO 分析 这题可以先对n个数进行快速排序 然后对于每次询问 用二分查找解决 有没有更快的做法 什么是HASH 哈希表是一种高效的数据结构 散列方法是使用函数h将U映射到表T 0 m 1 的下标上 m O U 这样以U中关键字为自变量 以h为函数的运算结果就是相应结点的存储地址 从而达到在O 1 时间内就可完成查找 一 整数的Hash函数构造方法 1 1 直接取余法关键字k除以m 取余数作为在Hash表中的位置 函数表达式可以写成 h k kmodm一般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 回到问题一 n最多为100000flag数组不开到109 但可以开flag 1 300000 可用取余法 解决冲突 将数组改为链表 问题二 问题一中的正整数改称字符串 每个字符串的长度不超过20 还是输入n个字符串 一共m次询问 in txt4 5个字符串catbananaappledog3 询问3次bananafruitpet out txtYESNONO 二 字符串的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小的数的个数 以排列4132为例 它是元素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定义为散列表的装填因子 LoadFactor 越大 表越满 冲突的机会也越大 通常取 1 解决冲突的方法 开散列方法 openhashing 也称为拉链法 separatechaining 闭散列方法 closedhashing 也称为开地址方法 openaddressing 这两种方法的不同之处在于 开散列法把发生冲突的关键码存储在散列表主表之外 而闭散列法把发生冲突的关键码存储在表中另一个槽内 拉链法 开散列方法的一种简单形式是把散列表中的每个槽定义为一个链表的表头 散列到一个特定槽的所有记录都放到这个槽的链表中 线性探查法 LinearProbing 将散列表T 0 m 1 看成是一个循环向量 若初始探查的地址为d 即h key d 则最长的探查序列为 d d l d 2 m 1 0 1 d 1 即 探查时从地址d开始 首先探查T d 然后依次探查T d 1 直到T m 1 此后又循环到T 0 T 1 直到探查到T d 1 为止 探查过程终止于三种情况 1 若当前探查的单元为空 则表示查找失败 若是插入则将key写入其中 2 若当前探查的单元中含有key 则查找成功 但对于插入意味着失败 3 若探查到T d 1 时仍未发现空单元也未找到key 则无论是查找还是插入均意味着失败 此时表满 思考题1 distinct 试题描述 陶陶为了给一道平面几何题出数据 需要产生N个点 x i y i 已知x y是由伪随机函数顺序产生 即 X i 1 X i Ax Bx i modCxY i 1 Y i Ay By i modCyX 1 Ax Bx Cx Y 1 Ay By Cy是事先给定最少要产生前多少项时 正好有N个不相同的点 数据范围 1 N 1 000 000 其它所有数据都在 1 1 000 000 000 范围内 分析 数据最大为106 O N2 超时 每次要求查找某个数 由于是动态的 不好先排序 用O NlogN 时间复杂度即可 可以用平衡树之类 但现有编程复杂度高 时间系数也大 对快速插入 查找操作 比较简洁有效的方法是hash表算法 试题描述 农民约翰打算建一个新的矩形谷仓 但是 矩形谷仓的4个角落不能在落在软土路基上 只能落在一些固定点上 现在 他已经找到地面上有N 4 N 1 000 个点 角落只可以落在这些点上 他想知道依次每加多一个点 可以建立新谷仓的方法数量 请你帮助他找到答案 数据范围 1 N 1 000所有的x y都不会超过16 000 所有点都是不同的 思考题2 Allbarns 分析 从样例知道矩形是可以不平行于X Y轴的 N 1 000 可以用O N N 算法 可以先产生所有边 从几何知识知道 如果两条线段长度相同 中点重合 则一定是一个矩形的对角线 反之也成立 因此问题成为 查找长度和中点都相同的线段有多少 由于是动态插入 查找 一般用hash表方法最有效 思考题3 找名字 找名字给定一个全部由字符串组成的字典 字符串全部由大写字母构成 其中为每个字符串编写密码 编写的方式是对于n位字符串 给定一个n位数 大写字母与数字的对应方式按照电话键盘的方式 2 A B C5 J K L8 T U V3 D E F6 M N O9 W X Y4 G H I7 P R S题目给出一个1 12位的数 找出在字典中出现且密码是这个数的所有字符串 字典中字符串的个数不超过8000 分析 对于给定的编码 只需要一个回溯的过程 所有可能的原字符串都可以被列举出来 剩下的就是检查这个字符串是否在给定的字典中了 所以这个问题需要的还是 某个元素是否在已知集合中 由于给出的 姓名 都是字符串 因此我们可以利用字符的ASCII码 那么 如何设计这个哈希函数呢 注意到题目给出的字典中 最多能有5000个不同元素 而一个字符的ASCII码只能有26种不同的取值 因此至少需要用在3个位置上的字符 263 5000 但是262 5000 于是我们就选取3个位置上的字符 由于给定的字符串的长度从1 12都有可能 为了容易实现 选取最开始的1个字符和最末尾的2个字符 让这3个字符组成27进制的3位数 则这个数的值就是这个字符串的编码 这样哈希函数就设计出来了 思考题4 烦恼的设计师 给定两个正6边形的花坛 要求求出从第一个变化到第二个的最小操作次数以及操作方式 一次操作是 选定不在边上的一盆花 将这盆花周围的6盆花按照顺时针或者逆时针的顺序依次移动一个单位 一个花坛里摆放的不同种类的花不超过3种 对于任意两种花 数量多的花的盆数至少是数量少的花的2倍 输入 输入文件共11行 1 5行描述花坛的初始状态 7 11行表示花盆应摆放的位置 中间以空行分隔 5行数字分别表示花坛的5个行 其中第1 5两行有3个整数 第2 4两行有4个整数 第3行有5个整数 表示每一行的花的类型 不同的数代表不同种类的花 输出 输出文件第一行包含一个整数T即最少的操作数 数据保证20步之内有解 以下T行输出操作序列 每行代表一次操作 包括3个整数Xi Yi Ki Xi Yi 表示第i步转动第Xi行 第Yi盆花下的转盘 当Ki为0时表示向顺时针方向转动 Ki为1时表示向逆时针方向转动 如有多种方案 任意输出其中一种即可 题意简述 本题要求将一个边长为3的六边形 阵 共19个元素 通过一定的规则变换 从初始状态转化为目标状态 并使变换的次数最少 具体规则如下 每次选定除边缘之外的7个元素之一 将其周围的6个元素沿顺时针方向或逆时针方向移动一个位置 输入初始状态和目标状态 输出最少变换次数以及一种是变换次数最少的变换方法 分析 首先确定本题可以用广度优先搜索处理 然后来看问题的规模 正6边形共有19个格子可以用来放花 而且根据最后一句限定条件一个花坛里摆放的不同种类的花不超过3种 对于任意两种花 数量多的花的盆数至少是数量少的花的2倍 至多只能存在C 2 19 C 5 17 1058148种状态 用宽搜完全可行 用HASH表判重 然而在广搜的时候 可以预料产生的重复节点是相当多的 需要迅速判重才能在限定时间内出解 因此想到了哈希表 那么这个哈希函数如何设计呢 注意到19个格子组成6边形是有顺序的 而且每一个格子只有3种可能情况 那么用3进制19位数最大320 1 3486784400 完全可以承受 于是我们将每一个状态与一个整数对应起来 使用除余法就可以了 思考题5 方程的解数 已知一个n元高次方程 其中 x1 x2 xn是未知数 k1 k2 kn是系数 p1 p2 pn是指数 且方程中的所有数均为整数 假设未知数1 xi M i 1 2 n 求这个方程的整数解的个数 约束条件1 n 6 1 M 150 方程的整数解的个数小于231 分析 1 题目要求出给定的方程解的个数 这个方程在最坏的情况下可以有6个未知数 而且次数由输入决定 这样就不能利用数学方法直接求出解的个数 而且注意到解的范围最多150个数 因此恐怕只能使用枚举法了 最简单的思路是穷举所有未知数的取值 这样时间复杂度是O M6 无法承受 否缩小枚举的范围呢 分析 2 我们再次注意到M的范围 若想不超时 似乎算法的复杂度上限应该是O M3 左右 这是因为1503 10000000 这就启示我们能否仅仅通过枚举3个未知数的值来找到答案呢 如果这样 前一半
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化纤耐热张力调整工艺考核试卷及答案
- 木地板环保检测工艺考核试卷及答案
- 绝缘材料测试工艺考核试卷及答案
- 灌溉自动化工艺考核试卷及答案
- 合成工艺考核试卷及答案
- 泵体焊接工艺考核试卷及答案
- 锡熔炼炉体材料加工工艺考核试卷及答案
- 半导体设备密封性测试工艺考核试卷及答案
- 牛群健康管理工艺考核试卷及答案
- 税务师考试《税法二》试题及答案指导(2025年)
- 2023年高考作文备考之广东重点中学六校四联“鲁侯养鸟”分析
- 半导体制造工艺基础之扩散工艺培训课件
- 溶剂油MSDS危险化学品安全技术说明书
- 检验标本的采集与运送课件
- 济南版生物七年级下册课程纲要
- 福建升辉鞋业有限公司年加工EVA鞋底385万双、TPR鞋底65万双、PVC鞋底60万双项目环评报告表
- 胸腺瘤诊断治疗指南
- 班主任到场签到表
- 视网膜静脉阻塞.LM
- 海底捞-A级门店管理制度
- 《陶行知教育名篇》读书笔记(课堂PPT)
评论
0/150
提交评论