哈希思想
很多人认为哈希表和哈希是同一个东西,但实际上,哈希是一种思想,而哈希表则是通过哈希思想实现的一种数据结构。
实际上通过哈希思想实现的数据结构有很多,如布隆过滤器,位图,哈希表等。
哈希表的两种实现
哈希表是通过一个哈希函数,从key快速得到value,而通过哈希函数可能导致一个value映射到同一个key,为了解决该问题,有两种方法。
1).开放地址法。
开发地址法通过当映射到同一个位置时,则可以选择下一个没有被占据的位置插入。
开发地址法不能将整个哈希表所有元素填满,否则可能导致找不到插入位置,所以开发地址法存在一个负载因子 = 哈希表已有元素 / 哈希表容器。
当当前的哈希因子大于设置的哈希因子时,则就要进行扩容了。
1).开放地址法缺点:
开放地址法若其中元素过多,则可能导致查询的时间复杂度增加。
2).开放地址法的注意事项
扩容需要让所有元素重新插入新哈希表中,扩容可以使得哈希冲突减少。
2).哈希桶。
哈希同通过哈希函数将相同映射的元素挂在同一个key值下。
在STL库中,哈希表使用的也是该种方法,此种方法如果某个key值一直被映射,则会导致该key值下链接了很多元素,这会导致查询某个元素,可能会导致O(n)的时间复杂度,为了解决该问题,则可以通过将每个key下挂的链表换成红黑树,减少时间复杂度。
哈希函数
哈希函数就是从value 到 key的映射函数,一个好的哈希函数,可以使得哈希冲突的次数减少。
常见的哈希函数。
1).除留取余法。2).对于字符串类型,可以累加字符串的每一个字符。
STL中的哈希表
哈希函数常用的接口如下。
1).[]重载运算符,其中复用了insert函数,该接口比insert函数好用。
2).
size函数返回哈希表中key的种类。
3).
count函数用于检测某个key是否存在,如果存在,则返回1,否则返回0。
4).
clear函数可以清空哈希表。