常见的哈希函数的构造方法简介

一、除留取余法

除留取余法是将关键字除以一个不大于哈希表长度的正整数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、将选择的数字组合作为哈希值:


哈希值:56435588

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 转换为 “5292025 转换为 “20254489 转换为 “44897921 转换为 “7921144 转换为 “144

3、截取字符串:

529 的位数为 3,从中间截取一段得到索引位置 “22025 的位数为 4,从中间截取两段得到索引位置 “024489 的位数为 4,从中间截取两段得到索引位置 “487921 的位数为 4,从中间截取两段得到索引位置 “92144 的位数为 3,从中间截取一段得到索引位置 “4

4、转换为整数:

2” 转换为索引位置 202” 转换为索引位置 248” 转换为索引位置 4892” 转换为索引位置 924” 转换为索引位置 4

最终,我们可以将关键字分别映射到哈希表的索引位置 2、2、48、92 和 4。

五、折叠法

折叠法(Folding Method)是一种哈希函数的构造方法,用于将给定的关键字(Key)映射到哈希表的索引位置。

该方法的基本思想是将关键字拆分为多个部分,然后将这些部分进行折叠、求和等操作,最后得到一个哈希值作为索引位置。

具体步骤如下:

1、将关键字拆分为固定长度的部分(可以是相等长度或不等长度)。
2、对拆分后的每个部分进行求和、折叠等操作,得到一个哈希值。
3、将哈希值取模,得到最终的索引位置。

折叠法的优点是可以应对关键字长度不一致的情况,同时可以增加哈希值的随机性。然而,该方法也可能存在一些问题,如部分折叠方式可能导致哈希冲突,或者在拆分关键字时可能需要额外处理边界情况。

举例说明:

假设我们有一个关键字集合 {1234567, 987654321, 555, 8888},我们希望将这些关键字映射到一个哈希表中。

使用折叠法,我们可以按照以下步骤进行哈希函数的构造:

1、拆分关键字:


1234567 拆分为 1234567
987654321 拆分为 987654321
555 拆分为 555
8888 拆分为 8888

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。

猜你喜欢

转载自blog.csdn.net/qq_39939541/article/details/132330607
今日推荐