概述
哈希表又称散列表,它用于快速查找。
查找,如果能够不经过比较,直接就能得到待查记录的存储位置,那效率必定很高。
通过在记录的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key跟唯一的存储位置H(key)对应,那么当我们想查找关键码为k的记录时,直接到H(k)处取即可。这种查找技术叫做散列技术。
采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,将关键码映射为散列表中适当存储位置的函数称为散列函数。
散列主要是面向查找的数据结构,它不适用于范围查找(如找最大最小值、某一个范围内的值等等)。它最适合回答的问题是:如果有的话,哪个记录的关键码等于待查值。
散列表有一个问题:对于两个不同的关键码k1 != k2,有H(k1) = H(k2),即两个不同的记录需要存放在同一个存储空间中,这种现象称为冲突。
散列技术需要考虑的两个主要问题:
- 散列函数的设计(力求简单、均匀、存储利用率高);
- 冲突的处理。
散列函数
设计原则:
- 计算简单(否则影响查找效率);
- 函数值,即散列地址均匀分布(充分利用存储空间,减少冲突)。
直接定址
散列函数为关键码的线性函数:
H(key) = a * key + b (a、b为常数)
特点:单调、均匀,不会产生冲突;
适用于事先知道关键码的分布,且关键码集合不是很大而连续性号的情况。
实际不常用。
除留取余
H(key) = key mod p (p为正整数)
关键在于p的选取,一般情况下,若表长为m,通常选p为小于等于表长(最好接近m)的最小素数或与2的整数幂不太接近的质数或不包含小于20质因子的合数。
平方取中
平方取中法将关键码平方后,按散列表的大小,取中间的若干位作为散列地址。因为一个数平方后,中间几位分布较均匀,从而冲突发生的概率较小。
折叠法
折叠法将关键码从左到右分割成位数相等的几步分,最后一部分位数可以