散列表(Hash Table),也称哈希表、散列查找表,是一种根据关键字(Key)直接访问内存存储位置的数据结构。在散列表中对每个关键字都只在表中占据一个位置,因此其时间复杂度与表长无关,可达到O(1)的常数级别查询速度,是一种十分高效的数据结构。
散列表的构造有两部分:散列函数和冲突解决方法。
1. 散列函数
散列函数是将不同的关键字映射为不同的位置,这些位置称为散列地址。散列函数的设计要考虑以下要素:
(1)一致性:对于相同的关键字,其散列地址应该总是相同的。
(2)均匀性:散列函数应该将不同的关键字均匀地分配到散列表的各个位置中,避免产生“热点”,即某些位置比其他位置频繁地被访问。
(3)高效性:计算散列地址的过程应该尽可能地简单和高效,避免成为瓶颈。
常用的散列函数有直接定址法、除留余数法、数字分析法、随机数法等。其中,最为广泛应用的散列函数是取模法,即$h(key)=key\mod m$,$m$为表长。
2. 冲突解决
由于散列表的表长是有限的,不同的关键字映射到相同的散列地址的情况是难以避免的。此时,就需要一个冲突解决方法来避免数据的丢失。
(1)开放定址法:当遇到冲突时,通过增加步长,依次探查表中的下一个位置,直到找到一个空闲的位置为止。其中,步长取值的方法有线性探测、二次探测、双重散列等。
(2)链地址法:将所有映射到同一个散列地址的关键字存储在一个链表中,而散列表中的每个位置仅存储对应链表的表头指针。
(3)建立公共溢出区:将所有与已有数据发生冲突的数据存储在一个公共区域中,并在散列表中记录对应数据存储在公共区域的位置。
在实际应用中,常常会根据具体问题的情况选择不同的散列函数和冲突解决方法。
微信扫一扫,领取最新备考资料