文章目录
一、除留取余法
除留取余法是将关键字除以一个不大于哈希表长度的正整数p,并将所得余数作为地址。
具体而言,除留取余法的步骤如下:
1、选择一个不大于哈希表长度的正整数p作为除数。
2、将关键字除以除数p,并取余数作为哈希表的索引地址。
例如,假设我们有一个关键字集合 {apple, banana, cat, dog},我们希望将这些关键字映射到一个大小为10的哈希表中。
使用除留取余法,假设我们选择除数p为7。
此时,映射关系如下:
apple:索引位置为1(因为ascii码值之和为539,除以7的余数为1)
banana:索引位置为6(ascii码值之和为613,除以7的余数为6)
cat:索引位置为4(ascii码值之和为312,除以7的余数为4)
dog:索引位置为6(ascii码值之和为314,除以7的余数为6)
因此,我们可以将关键字分别映射到哈希表的索引位置 1、6、4和6。
除留取余法是一种简单且常用的哈希函数构造方法,可以在常数时间内计算哈希值。但需要注意的是,选择合适的除数对于哈希表的性能影响较大,不同的除数可能导致不同的哈希冲突情况。
二、直接定址法
直接根据key来映射到对应的数组位置的方法称为直接定址法(Direct Addressing)。
在直接定址法中,关键字的取值范围通常需要与数组的大小相匹配,以便每个关键字都能被映射到数组中的一个位置。
例如,假设有一个大小为10000的数组,我们想要将关键字1232映射到数组中下标为1232的位置。可以直接将关键字作为数组的索引,将其放置在数组的相应位置。
实际上,直接定址法可以看作是一种特殊的哈希函数,其哈希函数的计算过程非常简单,直接将关键字作为索引值。因此,直接定址法的时间复杂度为O(1),即具有常数级别的查找效率。
需要注意的是,直接定址法要求关键字的取值范围较小且连续,否则会造成较大的空间浪费。同时,如果多个关键字映射到了同一个数组位置,就会发生冲突,需要解决冲突的方法,例如使用链表或开放地址法等。
三、数字分析法
数字分析法是一种哈希函数的构造方法,它通常会选择关键字中的某些数字作为映射的位置。关键字中的某些数字可以提供一些有用的信息,使得哈希函数能够将关键字均匀地映射到哈希表中。
在数字分析法中,我们可以选择关键字的某些位数作为映射的位置。常见的选择包括关键字的最高位、最低位、中间位或者特定的位数组合,例如十位和百位数字。
通过选择不同的位数组合,我们可以构造出不同的哈希函数,以满足特定的需求和要求。数字分析法是一种简单而有效的哈希函数构造方法,可以在某些情况下产生良好的分布性能。
假设我们有一个关键字集合 {1234567, 987654321, 555, 8888},我们希望将这些关键字映射到一个哈希表中。
使用数字分析法,我们可以按照以下步骤进行哈希函数的构造:
1、将关键字表示为数字形式:
1234567
98765432
555
8888
2、取关键字的十位和百位数字作为映射的位置:
第一关键字:56
第二关键字:43
第三关键字:55
第四关键字:88
3、将选择的数字组合作为哈希值:
哈希值:56、43、55、88
4、哈希值取模:
56 取模得到索引位置 6
43 取模得到索引位置 3
55 取模得到索引位置 5
88 取模得到索引位置 8
最终,我们可以将关键字分别映射到哈希表的索引位置 6、3、5 和 8。
四、平方取中法
平方取中法(Mid-Square Method)是一种哈希函数的构造方法,用于将给定的关键字(Key)映射到哈希表的索引位置。
该方法的基本思想是先将关键字平方,然后从中间截取一段,作为哈希表的索引位置。
具体步骤如下:
1、将关键字进行平方操作。
2、将平方后的结果转换为字符串。
3、如果结果字符串的位数是奇数,则从中间位置开始截取一段作为索引位置;如果是偶数,则从中间两位开始截取一段作为索引位置。
4、将截取的字符串转换为整数,作为哈希表的索引位置。
平方取中法的优点是简单快速,适用于关键字分布均匀的情况。然而,该方法也存在一些问题。首先,如果平方后的结果位数较长,可能导致截取的字符串不够随机,使得哈希值分布不均匀;其次,对于特定的关键字集合,可能会出现哈希冲突,即不同的关键字映射到了同一个索引位置。
因此,在实际应用中,需要根据具体情况选择合适的哈希函数构造方法,以避免冲突和提高哈希表的性能。
假设我们有一个关键字集合 {23, 45, 67, 89, 12},我们希望将这些关键字映射到一个哈希表中。
使用平方取中法,我们可以按照以下步骤进行哈希函数的构造:
1、平方操作:
23 平方后得到 529
45 平方后得到 2025
67 平方后得到 4489
89 平方后得到 7921
12 平方后得到 144
2、转换为字符串:
529 转换为 “529”
2025 转换为 “2025”
4489 转换为 “4489”
7921 转换为 “7921”
144 转换为 “144”
3、截取字符串:
529 的位数为 3,从中间截取一段得到索引位置 “2”
2025 的位数为 4,从中间截取两段得到索引位置 “02”
4489 的位数为 4,从中间截取两段得到索引位置 “48”
7921 的位数为 4,从中间截取两段得到索引位置 “92”
144 的位数为 3,从中间截取一段得到索引位置 “4”
4、转换为整数:
“2” 转换为索引位置 2
“02” 转换为索引位置 2
“48” 转换为索引位置 48
“92” 转换为索引位置 92
“4” 转换为索引位置 4
最终,我们可以将关键字分别映射到哈希表的索引位置 2、2、48、92 和 4。
五、折叠法
折叠法(Folding Method)是一种哈希函数的构造方法,用于将给定的关键字(Key)映射到哈希表的索引位置。
该方法的基本思想是将关键字拆分为多个部分,然后将这些部分进行折叠、求和等操作,最后得到一个哈希值作为索引位置。
具体步骤如下:
1、将关键字拆分为固定长度的部分(可以是相等长度或不等长度)。
2、对拆分后的每个部分进行求和、折叠等操作,得到一个哈希值。
3、将哈希值取模,得到最终的索引位置。
折叠法的优点是可以应对关键字长度不一致的情况,同时可以增加哈希值的随机性。然而,该方法也可能存在一些问题,如部分折叠方式可能导致哈希冲突,或者在拆分关键字时可能需要额外处理边界情况。
举例说明:
假设我们有一个关键字集合 {1234567, 987654321, 555, 8888},我们希望将这些关键字映射到一个哈希表中。
使用折叠法,我们可以按照以下步骤进行哈希函数的构造:
1、拆分关键字:
1234567 拆分为 12、34 和 567
987654321 拆分为 98、76、54 和 321
555 拆分为 5 和 55
8888 拆分为 8 和 888
2、折叠求和:
12+34+567=613
98+76+54+321=549
5+55=60
8+888=896
3、哈希值取模:
613 取模得到索引位置 5
549 取模得到索引位置 9
60 取模得到索引位置 0
896 取模得到索引位置 6
最终,我们可以将关键字分别映射到哈希表的索引位置 5、9、0 和 6。