哈希表(Hash Table)介绍
哈希表(Hash Table):也叫做散列表。是根据键值(Key Value、关键码值)直接进行访问的数据结构。
哈希表通过“键(key)”和“映射函数(Hash Function)”计算出对应的“值(value)”,把关键值映射到表中一个位置(哈希值)来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(散列函数),存放记录的数组叫做哈希表(散列表)。
哈希表的主要操作包括:
插入(Insert):将键值对插入哈希表中。如果键已经存在,则更新其对应的值。
查询(Search):根据键查找并返回对应的值。
更新(Update):根据键更新对应的值。
删除(Delete):根据键删除对应的键值对。
哈希表在很多编程语言和库中都有实现,例如 JavaScript 中的 Map 和 Set 对象,以及 Python 中的 dict 数据结构。哈希表的应用非常广泛,例如在数据库、缓存、消息队列等领域都有重要的作用。
哈希表特点:
哈希表(Hash Table),是一个数据结构。
哈希表本质上就是一个数组,只不过数组存放的是单一的数据,而哈希表中存放的是键值对(key - value pair)。
key 通过哈希函数(hash function)得到数组的索引,进而存取索引位置的值。
不同的 key 通过哈希函数可能得到相同的索引值,此时,产生了哈希碰撞。
在哈希表中,键的存储位置是通过散列函数映射得到的。不同的关键字可能得到相同的散列地址,这种情况称为冲突(Collision)。
解决哈希冲突的常见方法是使用链地址法(Chaining)也叫开散列、开放地址法(Open addressing)也叫闭散列。
链地址法:将所有关键字为同义字的记录存储在一个单链表中,我们称这种单链表为同义词子表,散列表中存储同义词子表的头指针。如关键字集合为{19,14,23,01,68,20,84,27,55,11,10,79},按哈希函数H(key) = key mod 13;
链地址法解决了冲突,提供了永远都能找到地址的保证。但是,也带来了查找时需要遍历单链表的性能损耗。
开放地址法:一旦发生了冲突就去寻找下一个空的哈希地址,只要哈希表足够大,空的散列地址总能找到,并将记录存入。
公式:Hi=(H(*key) + Di) mod m (i = 1,2,3,….,k k<=m-1)
其中:H(key)为哈希函数;m为哈希表表长;Di为增量序列,有以下3中取法:
①Di = 1,2,3,…,m-1, 称为线性探测再散列;
②Di = 1²,-1²,2²,-2²,。。。,±k²,(k<= m/2)称为二次探测再散列
③Di = 伪随机数序列,称为伪随机数探测再散列。
例如:在长度为12的哈希表中插入关键字为38的记录:
待续