数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】
目录:
一:直接定址法
二:数字分析法
三:平方取中法
四:折叠法
五:除留余数法
六:随机数法
这些方法原理都是将原来数字按某种规律变成另一个数字
一:直接定址法
取关键字的某个线性函数值作为散列地址:
直接定址法获取得到的散列函数有点就是简单,均匀也不会产生冲突
但问题是这需要事先知道关键字的分布情况
适合查找表较小且连续的情况
由于这样的限制,在现实应用中,此方法虽然简单,但却并不常用
二:数字分析法
如果关键字是位数较多的数字(比如手机号),且这些数字部分存在相同规律
则可以采用抽取剩余不同规律部分作为散列地址
比如手机号前三位是接入号,中间四位是 HLR 识别号,只有后四位才是真正的用户号
也就是说,如果手机号作为关键字,那么极有可能前 7 位是相同的
此时我们选择后四位作为散列地址就是不错的选择
同时,对于抽取出来的数字,还可以再进行反转
右环位移,左环位移等操作
目的就是为了提供一个能够尽量合理地将关键字分配到散列表的各个位置的散列函数
数字分析法通常适合处理关键字位数比较大的情况
如果事先知道关键字的分布且关键字的若干位分布较均匀,就可以考虑用这个方法
三:平方取中法
即取关键字平方的中间位数作为散列地址
比如假设关键字是 4321,那么它的平方就是 18671041,抽取中间的 3 位就可以是 671,也可以是 710,用做散列地址
平方取中法比较适合于不知道关键字的分布,而位数又不是很大的情况
四:折叠法
折叠法是将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些)
然后将这几部分叠加求和
并按散列表表长,取后几位作为散列地址
比如假设关键字是 9876543210,散列表表长为三位
则我们可以将它分为四组 987|654|321|0
然后将它们叠加求和 987+654+321+0=1962
再取后 3 位得到散列地址即为 962
有时可能这还不能够保证分布均匀
那么也可以尝试从一端到另一端来回折叠后对齐相加
比如讲 987 和 321 反转
再与 654 和 0 相加,变成 789+654+123+0=1566
此时散列地址为 566
折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况
五:除留余数法
此方法为最常用的构造散列函数方法
对于散列表长为的散列函数公式为:
很显然,本方法的关键就在于选择合适的
根据前辈们的经验
若散列表表长为
通常 为小于或等于表长(最好接近)的最小质数或不包含小于 20 质因子的合数
六:随机数法
选择一个随机数
取关键字的随机函数值为它的散列地址:
当关键字的长度不等时采用这个方法构造散列函数是比较合适的
数据结构—— 构造散列函数的六种方法【直接定址法-数字分析法-平方取中法-折叠法-除留余数法-随机数法】相关推荐
- 数据结构:哈希表函数构造和冲突解决方法
哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...
- 哈希表构造与处理冲突方法
我们知道:哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.如果Key一样,则在一起,如果Key不一样,则不在一起.哈希表的查询是飞快的.因为它不需要从头搜索,它利用Key的 ...
- 用C语言编码定积分,C语言__用六种方法求定积分C语言__用六种方法求定积分.doc...
C语言__用六种方法求定积分C语言__用六种方法求定积分 描述问题 利用①左矩形公式,②中矩形公式,③右矩形公式 ,④梯形公式,⑤simpson公式,⑥Gauss积分公式求解定积分. 分析问题 2.1 ...
- 构造hash表的方法
一.整数的Hash函数 常用的方法有三种:直接取余法.乘积取整法.平方取中法.下面我们对这三种方法分别进行讨论.以下假定我们的关键字是,Hash表的容量是,Hash函数为 . 1.直接取余法 我们用关 ...
- (4)散列函数设计:除留余数法
除留余数法介绍 除留余数法此方法为最常用的构造散列函数方法.对于散列表长为m的散列函数公式为: f( key ) = key mod p ( p ≤ m ) mod是取模(求余数)的意思.事实上,这方 ...
- 散列函数设计:除留余数法
散列函数设计:除留余数法 转载地址 感谢分享 除留余数法介绍 除留余数法此方法为最常用的构造散列函数方法.对于散列表长为m的散列函数公式为: f( key ) = key mod p ( p ≤ m ...
- 哈希函数 直接定址法 除留余数法
直接定址法 直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址,即:H(k)=k 或 H(k)=a×k+b : (其中a,b为常数) 例1,有一个人口统计表,记录了从1岁到100岁的人 ...
- 乘积取中法matlab,迭代取中法、乘同余法及混合同余法产生随机数方法
在用计算机编制程序时,经常需要用到随机数,尤其在仿真等领域,更对随机数的产生提出了较高的要求,仅仅使用 C 语言类库中的随机函数已难以胜任相应的工作.现实中,用投色子计数的方法产生真正的随机数,但电脑 ...
- 白盒测试方法|白盒测试的六种方法比较分析
白盒测试的六种方法比较分析 一.摘要 白盒测试是测试人员常用的一种测试方法,越来越受到测试工程师的重视.白盒测试并不是简单的按照代码测试用例而走,需要根据不同的测试需求,结合不同的测试对象,使用适合的 ...
最新文章
- 用深度神经网络搭建马赛克神器,高清无码效果感人
- 前端入门(加载特效,css)
- 贝叶斯推断及其互联网应用(二):过滤垃圾邮件
- 解题报告 『[NOI2014]起床困难综合症(位运算)』
- 多项式辗转相除法求最大公约数_多项式的一些性质
- 阿里云、蚂蚁开源 Nydus——容器镜像加速服务
- ppt复制切片器_【PPT】高端人物活动介绍页PPT创意设计制作
- 想成为NLP算法工程师,你必须要看一下这10篇论文!
- Reg Exp正则表达式
- python_类装饰器
- 优雅的实现微信分享/支付,组件化
- Ubuntu 命令技巧
- 人事管理系统都有哪些功能和优势?
- Bex5文档服务器,不通过登录直接打开BeX5的首页和功能页的url是什么?
- Redis主从服务器安装配置
- 济南职工医保统筹的一些了解
- 教育心理学有一句名言
- 韩天峰(Rango)推荐书目
- 第二章:软件项目确立
- Exynos_4412——ADC实验