哈希概念
哈希是为了实现快速查找的一种方法,时间复杂度为O(1),通过哈希函数将元素的储存位置与它的关键码之间建立一一映射的关系,因次可以快速找到该元素。
比如储存数据集合,{1,2,3,4,5,8}
哈希函数设置为hash(key) = key%capacity,capacity是储存空间的大小。(此时capacity为10)
但我们会发现当插入,11,21,1这些元素时,会映射到相同的哈希地址,这种情况叫做哈希冲突。为了解决这一问题,我们需要设置合理的哈希函数。
哈希冲突的解决
有两种常见的方法,闭散列和开散列。
闭散列:
也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那
么可以把key存放到冲突位置中的“下一个” 空位置中去。
而如何寻找下一个空位置呢?
就需要线性探索,从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。
开散列:
开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。