散列函数的构造方法
来源:互联网 发布:js 重新启动定时器 编辑:程序博客网 时间:2024/05/16 13:51
1、散列函数的选择有两条标准:简单和均匀。
简单指散列函数的计算简单快速;
均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集K随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。
2、常用散列函数
为简单起见,假定关键字是定义在自然数集合上。
(1)平方取中法
具体方法:先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。
【例】将一组关键字(0100,0110,1010,1001,0111)平方后得
(0010000,0012100,1020100,1002001,0012321)
若取表长为1000,则可取中间的三位数作为散列地址集:
(100,121,201,020,123)。
相应的散列函数用C实现很简单:
int Hash(int key){ //假设key是4位整数
key*=key; key/=100; //先求平方值,后去掉末尾的两位数
return key%1000; //取中间三位数作为散列地址返回
}
(2)除余法
该方法是最为简单常用的一种方法。它是以表长m来除关键字,取其余数作为散列地址,即 h(key)=key%m
该方法的关键是选取m。选取的m应使得散列函数值尽可能与关键字的各位相关。m最好为素数。
【例】若选m是关键字的基数的幂次,则就等于是选择关键字的最后若干位数字作为地址,而与高位无关。于是高位不同而低位相同的关键字均互为同义词。
【例】若关键字是十进制整数,其基为10,则当m=100时,159,259,359,…,等均互为同义词。
(3)相乘取整法
该方法包括两个步骤:首先用关键字key乘上某个常数A(0<A<1),并抽取出key.A的小数部分;然后用m乘以该小数后取整。即:
该方法最大的优点是选取m不再像除余法那样关键。比如,完全可选择它是2的整数次幂。虽然该方法对任何A的值都适用,但对某些值效果会更好。Knuth建议选取
该函数的C代码为:
int Hash(int key){
double d=key *A; //不妨设A和m已有定义
return (int)(m*(d-(int)d));//(int)表示强制转换后面的表达式为整数
}
(4)随机数法
选择一个随机函数,取关键字的随机函数值为它的散列地址,即
h(key)=random(key)
其中random为伪随机函数,但要保证函数值是在0到m-1之间。
- 散列函数的构造方法
- 散列函数的构造方法
- 散列函数的构造方法
- 构造散列函数的方法
- 散列技术-散列函数的构造方法
- 常用的构造散列函数的方法
- 构造哈希(散列)函数的方法
- 散列函数的6个构造方法
- 散列函数的6个构造方法
- 散列函数的构造方法11.1.2
- 第6章 散列查找 —— 6.1 散列函数的构造方法
- 构造散列函数
- 构造字符串的散列函数
- 散列表查询(哈希表)之散列函数的构造方法
- 我对构造散列函数的理解
- 散列表基本概念以及常见散列函数构造方法(一)
- hash函数的构造方法
- 散列表(一):散列表概念、 散列函数构造方法、 常见字符串哈希函数(测试冲突)
- 将Excel文件数据库导入SQL Server
- FAQ —— C#
- WPF - 取代GDI/GDI+ ?
- 开发过程的又一次洗礼
- 反对的是垄断而非微软
- 散列函数的构造方法
- 程序员更像艺术家 哪种心理更具创造性?
- 比客网,是个小店?
- ASP.NET 2.0配合MasterPage的优化CSS
- kfs嵌入式文件系统应用指南(二)
- [Maya学习内容日记]20070808
- fun-safari on windows
- asp.net中页面间传值方法
- 是误解,还是我自己有问题!?