图解算法笔记|散列表

163 阅读2分钟

图解算法笔记|散列表

散列函数就是我们常说的hash,散列函数就是你给他一个数据,他返回给你一个存储位置,也就是一种键值关系.如php python中的数组/字典,go中的map

1. 应用

将散列表用于查找:

  • 电话簿中个人姓名与手机号, 建立映射关系,也就是建立键值对.
  • 通过域名找到对应的IP, 我们在解析域名到某台服务器的时候,就是建立这种映射关系.

防止重复:

插入动作之前,仙进行查询,看是否已经存在了,然后再进行相应的逻辑处理

用于缓存

缓存相当于在请求和逻辑处理之前做了一个拦截层,如果以前请求过相同的内容,则直接从缓存中获取,否则才进行后面的逻辑处理,这个缓存,其实就是请求连接和内容的键值关系,也即是一张散列表

2. 冲突

假设散列表的创建映射关系时,采用的连续的空间,按照26个字母,分别空间,比如apple他会放到a开头的存储空间,这时,如果有另一个以a开头的单词存储进来,但是这个空间已经被apple占据了,就会产生冲突,而解决冲突的方式,是将后面的单词以链表的形式,追加到后面

追加链表出现的问题,如果所有数据都是同一个字母开头,那这个数据结构就变成了链表,读取起来就慢了很多,因为链表并不适合随机读取,而要解决这个问题就需要让链表的长度不要 太长,也就是数据均匀分布,这样才能让散列表有数组的读取速度和链表的插入修改速度. 未解决这个问题,一个好的散列表需要有较低的填装因子,和良好的散列函数.

  • 填装引子: (填充的元素数量)/(空间大小), 随着填装的元素越来越多,这个值可能会逐渐增大,如要填充的元素100,实际空间50,这时填装引子为2,这时就需要扩容了,一旦填装引子大于0.7就需要调整散列表的长度

  • 良好的散列函数: sha函数