hyh-first-blog

后端小白的学习之路

哈希表

前言:在做团队新人任务时遇上了top k url类的问题,经搜寻需要用到hashmap+最小堆的算法,就学习一下哈希表这种数据结构。

1.哈希表定义

若无需像各种排序和查找那样进行比较,而只需建立对应关系f,并根据f就可找到相应的存储位置,则称f为哈希函数,而根据此思想建立的表就为哈希表。哈希函数本质上是一种映像,只需要使得哈希函数值都落在表长允许范围之内即可,其本身十分灵活。哈希表就是根据设定的哈希函数和处理哈希冲突的方法,将关键字映射到一组连续有限地址,将作为关键字的存储地址,则这组连续地址即为哈希表,映像过程便为哈希造表散列,存储地址便为哈希地址散列地址

2.哈希函数

  • 哈希冲突:由于对不同关键字可能会得到同一个哈希地址,所以此时在这个位置便出现了冲突,所以需要合适的构造哈希函数来尽可能避免冲突的出现。(当然,冲突是不可避免的,后续会有解决这种冲突的办法)
  • 哈希函数的构造方法
    哈希函数的构造原则为尽量让关键字得到随机的地址,减少哈希冲突的存在。
    1.直接定址法:取关键字的线性函数值为哈希地址(这种函数也叫自身函数)其地址集合和关键字集合大小相同。
    2.数字分析法:根据数据特点选有区别性的数字
    3.平方取中法:取关键字平方后中间几位为哈希地址
    4.折叠法:将关键字分割成位数相等的几位(最后一部分可能位数不同),再累加
    5.除留余数法/位运算法:最简单、最常用,将关键字与一个不超过表长的数取模。JAVA中HashMap的好像用的是&位运算,其HashMap长度为16或2的整数次幂,index = hashcode(key)&(len - 1)。
    6.随机函数法:常用于关键字长度不等

3.处理哈希冲突的办法

  • 1.开放定址法
  • 2.再哈希法
  • 3.链地址法
    感觉好像常用的就是链地址法,即将关键词为同义词存储在同一个线性链表中,可理解为数组中嵌套链表,Go语言中的map就是由此实现的,也是我打算用来解决这个问题使用的基本结构。
  • 4.建立公共溢出区法
posted on 2021-04-07 23:28  hyh_422  阅读(24)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: