7.5.散列表
1. 概念
-
散列函数:将查找表中的关键字映射到表中某一位置的函数,记作\(Hash(key) = Addr\)。
-
冲突:
-
散列函数可能会把多个关键字映射到表中同一位置,这种情况就称为冲突。
-
好的散列函数能减少冲突,但是不能避免冲突。
-
冲突会导致查找效率下降,存储效率降低。
-
-
散列表:
-
散列表是根据关键字直接访问的数据结构。
-
散列表以散列函数中的映射关系(关键字 $ \rightarrow $ 值)为基础,使用散列函数将关键字及其对应的数据存储到表中某个位置进行存储。
-
-
聚集:
-
聚集是多个关键字在哈希表的某些区域形成集中分布的现象,导致这些区域的冲突概率显著增加,从而降低哈希表的查找效率。例如:
-
Hash(key) = key % 7
-
关键字序列为:
-
存储情况
-
0 $ \rightarrow $ 0
-
7 $ \rightarrow $ 0(冲突,探测到1)
-
14 $ \rightarrow $ 0(冲突,探测到2)
-
21 $ \rightarrow $ 0(冲突,探测到3)
-
-
此时0,1,2,3位置被连续占据,形成聚集。
-
-
聚集会使得查找效率下降,哈希表性能劣化,扩容成本增加。
-
-
装填因子:
-
装填因子表示哈希表的饱和程度,计算公式为:$ \alpha = \frac{n}{m} $。
-
$ \alpha $越大,哈希冲突的概率越高,查找、插入性能下降。
-
多数哈希表在$ \alpha ≥ 阈值$ 的时候,哈希表会自动扩容(通常为0.75)。扩容后会重新哈希(Rehashing)。
-
2. 散列函数构造方法
-
除留余数法:H(key) = key % p(P为质数,且小于等于表长)。
-
直接定址法:H(key) = a * key + b(适合关键字连续分布)。
-
平方取中法:关键字平方后取中间几个数位。
-
折叠法:将关键字分割后相加。
-
数字分析法:通过分析关键字的数字分布特征,抽取其中分布均匀的位作为哈希地址。
-
设计原则:减少冲突,计算高效。

浙公网安备 33010602011771号