散列表是紧接布隆过滤器后我所要了解的,因为HasMap以及Dictionary等都与其有关。
没有计算机我们也会用散列表,比如查字典的时候我们都会根据首字母以及部首偏旁来帮助我们快速查找。
散列表的关键就是散列函数,也叫哈希函数。它的目的就是输入一个Key(比如 baidu)计算出一个散列值。
我们在存取值的时候,根据value去到其映射的地方存取值
散列函数有一个问题,就是不同的Key有可能算出同一个散列值,如此一来,1 对 1 的地址映射就会器冲突了,因为你也不想你通过 Key(Baidu)存进去和通过Key(google)存进去最后拿出来的东西是一模一样的。那么要解决这个冲突问题之前我想得先了解计算散列值的方法
1.直接地址法
线下函数取值
2.折叠法
你的散列值会被切割成多个同等位数的部分(最后部分的不一定同等),通过位运算折叠成一部分
3.除留余数法
找到一个数P,然后用你的值直接除以它,然后取余数(细品)。P一般取素数或者列表长度
细想一下,以上的方法其实都可能不同key算出同一散列值。怎么解决冲突呢?
1.开放地址法
这种其实就是,发生冲突了,直接取指向地址的下一个地址,一直取到没有别占有为止。
2.单独链表
冲突了,就让地址指向一个链表,每次冲突了就往链表里面加,链表一般使用栈结构。
3.再散列
冲突了嘛,那冲突地址再散列一遍呗,直到不冲突为止嘛。效率差的情况真的很差。
载荷因子概念:
载荷因子 = 元素个数/长度
载荷因子衡量了散列表的冲突可能性,载荷因子越大,冲突可能性越高。
最后
可以看出,散列表都是以随机的方式存储的,一个值存在哪个地址是根据算法而定的,它的存储位置是随机的。