散列函数和散列函数的列表/类型
散列是使用称为散列函数的数学函数从文本或数字列表生成值的过程。
哈希函数函数将给定的数字或字母数字键转换为小的实用整数值的函数。映射的整数值用作哈希表中的索引。简单来说,散列函数将一个有效数字或字符串映射到一个可以用作散列表中的索引的小整数。
该对的形式为(key, value) ,对于给定的键,可以使用某种将键映射到值的“函数”找到一个值。可以使用称为散列函数的函数计算给定对象的键。例如,给定一个数组 A,如果 i 是键,那么我们只需查找 A[i] 就可以找到值。
哈希函数的类型
有许多使用数字或字母数字键的散列函数。本文重点讨论不同的哈希函数:
- 分法。
- 中方法。
- 折叠方法。
- 乘法。
让我们开始详细讨论这些方法。
一、划分方法:
这是生成哈希值的最简单和最容易的方法。哈希函数将值 k 除以 M,然后使用获得的余数。
公式:
h(K) = k mod M
Here,
k is the key value, and
M is the size of the hash table.
M最好是素数,因为这样可以确保密钥更均匀地分布。散列函数取决于除法的余数。
例子:
k = 12345
M = 95
h(12345) = 12345 mod 95
= 90
k = 1276
M = 11
h(1276) = 1276 mod 11
=
优点:
- 这种方法对于任何 M 值都非常好。
- 除法方法非常快,因为它只需要一次除法操作。
缺点:
- 这种方法导致性能不佳,因为连续键映射到哈希表中的连续哈希值。
- 有时应特别注意选择 M 的值。
2. 中方法:
中方方法是一种非常好的散列方法。它涉及计算哈希值的两个步骤-
- 将密钥 k 的值平方,即 k 2
- 提取中间的r个数字作为哈希值。
公式:
h(K) = h(k x k)
Here,
k is the key value.
r的值可以根据表的大小来决定。
例子:
假设哈希表有 100 个内存位置。所以 r = 2 因为需要两位数才能将密钥映射到内存位置。
k = 60
k x k = 60 x 60
= 3600
h(60) = 60
The hash value obtained is 60
优点:
- 这种方法的性能很好,因为键值的大多数或所有数字都对结果有贡献。这是因为密钥中的所有数字都有助于生成平方结果的中间数字。
- 结果不受原始键值的高位或低位分布支配。
缺点:
- 密钥的大小是这种方法的限制之一,因为密钥的大小很大,所以它的正方形将加倍位数。
- 另一个缺点是会有碰撞,但我们可以尝试减少碰撞。
3.数字折叠方法:
该方法包括两个步骤:
- 将键值k划分为多个部分,即k1, k2, k3,….,kn ,其中每个部分的位数相同,但最后一部分的位数可以少于其他部分。
- 添加各个部分。通过忽略最后一个进位(如果有)来获得哈希值。
公式:
k = k1, k2, k3, k4, ….., kn
s = k1+ k2 + k3 + k4 +….+ kn
h(K)= s
Here,
s is obtained by adding the parts of the key k
例子:
k = 12345
k1 = 12, k2 = 34, k3 = 5
s = k1 + k2 + k3
= 12 + 34 + 5
= 51
h(K) = 51
笔记:
每个部分的位数取决于哈希表的大小。例如,假设哈希表的大小是 100,那么每个部分都必须有两位数,除了最后一个可以有较少位数的部分。
4.乘法
该方法包括以下步骤:
- 选择一个常数值 A,使得 0 < A < 1。
- 将键值与 A 相乘。
- 提取 kA 的小数部分。
- 将上述步骤的结果乘以哈希表的大小,即 M。
- 通过对步骤 4 中获得的结果取下限来获得结果哈希值。
公式:
h(K) = floor (M (kA mod 1))
Here,
M is the size of the hash table.
k is the key value.
A is a constant value.
例子:
k = 12345
A = 0.357840
M = 100
h(12345) = floor[ 100 (12345*0.357840 mod 1)]
= floor[ 100 (4417.5348 mod 1) ]
= floor[ 100 (0.5348) ]
= floor[ 53.48 ]
= 53
优点:
乘法方法的优点是它可以处理 0 到 1 之间的任何值,尽管有些值往往比其他值提供更好的结果。
缺点:
乘法方法一般适用于表大小为 2 的幂的情况,那么使用乘法散列的键计算索引的整个过程非常快。