哈希表定义
是根据关键字(key)而直接访问内存存储位置的一种数据结构
访问数据的方法是通过一个函数,映射到key值对应的位置,进行数据访问
这个映射函数成为散列函数/哈希函数,存放记录的数组称为散列表/哈希表
构造哈希表的几种方法
一般常用的就是这两种,其它的就不介绍了
- 直接定址法–取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。
- 除留余数法–取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。Hash(Key)= Key % P。
1)第一种方法很简单,但是有很大的缺陷,
当我们的数据特别的散列,数与数之间差距特别大时,就会造成许多的空间浪费,比如1,10000,400000只有三个数据,可是我们开空间却需要开很多;
2)第二种就比第一种好,但又会有新的问题——“哈希冲突”
就是当我们取模后,两个或多个数取模得到的数相同,那么它们要对应的位置就冲突了,当然我们也有相应的办法处理
解决哈希冲突的方法
1. 线性探测&二次探测
2.哈希桶——开链法
应用:位图&布隆过滤器
如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。
那如何解决呢?
我们都知道一个字节=8个比特位,我们可以用比特位的0/1来标识这个元素在没在集合里。这样可以节省很多空间,检索时,我们只要看看对应位置是不是都是 1 就(大约)知道它在不在集合中了,而形成的这个位列表(Bit array),也就是位图