1.开放定址法
Hi=(H(key)+di) mod m i=1,2,……,k(k≤m-1)
其中:H(key)为哈希函数;m为哈希表表长;di为增量序列,有三种取法。
① di=1,2,……,m-1;称为线性探测再散列或线性探查法。
② di=12,-12,22,-22,32,……,±k2,(k≤m/2);称为二次探测再散列。
③ di=伪随机数序列,称为伪随机探测再散列
2.再哈希法
Hi=RHi(key) i=1,2,……,k
RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生聚集,但增加了计算的时间。
3.链地址法(结合的同义词子表)
把具有相同散列地址的关键字存放在同一个链表中,称为同义词表。同时用数组 T存放各个链表的头指针。
凡是散列地址为i的记录都以结点方式插入到以T[i]为头指针的单链表中。
4. 建立一个公共的溢出区(分离的同义词子表)
假设哈希函数的值域为[0、、m-1],则设向量HashTable[0、、m-1]为基本表,每个分量存放一个记录,另
设立向量OverTable[0、、v]为溢出表。所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得
到的哈希地址是什么,一旦发生冲突,都填入溢出表。
PS.
什么是哈希表?Hi=(H(key)+di) mod m i=1,2,……,k(k≤m-1)
其中:H(key)为哈希函数;m为哈希表表长;di为增量序列,有三种取法。
① di=1,2,……,m-1;称为线性探测再散列或线性探查法。
② di=12,-12,22,-22,32,……,±k2,(k≤m/2);称为二次探测再散列。
③ di=伪随机数序列,称为伪随机探测再散列
2.再哈希法
Hi=RHi(key) i=1,2,……,k
RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生聚集,但增加了计算的时间。
3.链地址法(结合的同义词子表)
把具有相同散列地址的关键字存放在同一个链表中,称为同义词表。同时用数组 T存放各个链表的头指针。
凡是散列地址为i的记录都以结点方式插入到以T[i]为头指针的单链表中。
4. 建立一个公共的溢出区(分离的同义词子表)
假设哈希函数的值域为[0、、m-1],则设向量HashTable[0、、m-1]为基本表,每个分量存放一个记录,另
设立向量OverTable[0、、v]为溢出表。所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得
到的哈希地址是什么,一旦发生冲突,都填入溢出表。
哈希函数:
假设
F是一个包含n个记录的文件空间,Ri为文件中的某个记录(1≤i≤n),keyi是其关键字值,若存在关
键字值keyi与记录Ri的地址之间建立某种函数关系,则便可以通过这个函数把关键字值转换成相应记录在文件中的地址。即有:addr(Ri)=H(keyi),其中addr(Ri)为Ri的地址,H(keyi)称为哈希函数。
哈希表: 通过哈希函数构造而成的表称为哈希表。
把记录按地址存放到文件空间中相应的位置上,就形成了哈希表,也称散列表,构成哈希表的构成称为地址散列。
冲突: 若某个散列函数对于不同的关键字 key1和key2,得到相同的散列地址,这种现象称为冲突,这两个关键字称为 同义词。
解决冲突即为对应到同一地址的多个同义词安排存储位置。因此在选定散列函数是应该考虑尽量避免发生冲突,也就是说,一个好的散列函数应能将关键字值均匀地分布在整个地址空间中,是产生冲突的机会尽量少。但冲突是不可避免的,所以构造哈希表应包括选定均匀的散列函数,以及解决冲突的方法。
哈希函数的构造方法
哈希表: 通过哈希函数构造而成的表称为哈希表。
把记录按地址存放到文件空间中相应的位置上,就形成了哈希表,也称散列表,构成哈希表的构成称为地址散列。
冲突: 若某个散列函数对于不同的关键字 key1和key2,得到相同的散列地址,这种现象称为冲突,这两个关键字称为 同义词。
解决冲突即为对应到同一地址的多个同义词安排存储位置。因此在选定散列函数是应该考虑尽量避免发生冲突,也就是说,一个好的散列函数应能将关键字值均匀地分布在整个地址空间中,是产生冲突的机会尽量少。但冲突是不可避免的,所以构造哈希表应包括选定均匀的散列函数,以及解决冲突的方法。
1.直接地址法
取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a·key+b
2.数字分析法
假设关键字是以R为基的数(如2,8,10等),并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干数位来组成哈希地址。
例如:有80个记录,关键字为8位10进制数,则可取其中两位数作为哈希地址。
813 46 532 ①取中间4位中的任意两位。
813 72 242 ②取其中两位于另外两位的叠加和。
813 87 422
813 01 367
813 22 817
┆ ┆ ┆┆
3.平方取中法
有时一组关键字在每一位上某些数字的重复出现频率很高,例如:(
该方法适用于关键字位数少而相同的位数多的关键字。
4.折叠法(边界法)与转移法
有时关键字含位数较多,这时可将关键字值从某些地方断开,分成几段,其中一段的长度等于地址的位数,把其余折叠加到它的上面,若产生进位则舍去。0100,1100,1200,1160,2060,2163,2261,2262),这时无法是用数字分析法得到较均匀的哈希函数,平方取中法是首先求关键字的平方值,通过平方来扩大差别,然后再选其中的几位或其组合作为哈希地址。
5.除留余数法
取关键字被某个不大于哈希表表长m的数p除后所得的余数作为哈希地址。即:H(key)=key MOD p (p≤m 一般取p为不大于m的最大素数。)
6.随机数法
选择一随机函数,取关键字的随机函数值作为它的哈希地址。即:H(key)=random(key)当关键字长度不相等时,可以采用此方法。
选取哈希函数时需要考虑的因素:
①计算哈希地址所需要的时间
②关键字的长度
③哈希表的大小
④关键字的分布情况
⑤记录的查找频率
取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a·key+b
2.数字分析法
假设关键字是以R为基的数(如2,8,10等),并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干数位来组成哈希地址。
例如:有80个记录,关键字为8位10进制数,则可取其中两位数作为哈希地址。
813 46 532 ①取中间4位中的任意两位。
813 72 242 ②取其中两位于另外两位的叠加和。
813 87 422
813 01 367
813 22 817
┆ ┆ ┆┆
3.平方取中法
有时一组关键字在每一位上某些数字的重复出现频率很高,例如:(
该方法适用于关键字位数少而相同的位数多的关键字。
4.折叠法(边界法)与转移法
有时关键字含位数较多,这时可将关键字值从某些地方断开,分成几段,其中一段的长度等于地址的位数,把其余折叠加到它的上面,若产生进位则舍去。0100,1100,1200,1160,2060,2163,2261,2262),这时无法是用数字分析法得到较均匀的哈希函数,平方取中法是首先求关键字的平方值,通过平方来扩大差别,然后再选其中的几位或其组合作为哈希地址。
5.除留余数法
取关键字被某个不大于哈希表表长m的数p除后所得的余数作为哈希地址。即:H(key)=key MOD p (p≤m 一般取p为不大于m的最大素数。)
6.随机数法
选择一随机函数,取关键字的随机函数值作为它的哈希地址。即:H(key)=random(key)当关键字长度不相等时,可以采用此方法。
选取哈希函数时需要考虑的因素:
①计算哈希地址所需要的时间
②关键字的长度
③哈希表的大小
④关键字的分布情况
⑤记录的查找频率