算法图解--学习笔记(散列表)

186 阅读1分钟

关键字

  • 散列函数
  • 链表
  • 数组
  • 冲突
  • 装填因子

数学公式

装填因子计算公式:

装填因子 = 散列表的元素数 / 位置的总数

比如:

// 一个map对象, 有两个Key,那么散列表的元素数是2
map = { name: "jack", age: 22 }

// 如果这个map对象的位置总数是5,那么这个装填因子( x )就是:
x = 2/5 = 0.4

注:位置总数可以理解为数组的长度,因为散列表底层就是一个数组

算法时间复杂度

时间复杂度为 O(1) ,属于常量时间,不管散列表有多大都一样。

散列表的原理

  • 分配一个空数组
  • 开始装填一个Key Value的时候,先用key通过一些数学方法计算得出一个位置(数组的下标),然后把value存到对应的数组下标,当然,这个算法必须保证相同的key总是计算得出相同的位置
  • 如果计算遇到不同的key得到相同下标,那么数组下标这个位置就变成链表去存储不同key的值(这种情况也叫冲突)
  • 取值的时候原理也一样,通过计算key得到数组下标,然后可以直接取出value

关于key的一些计算方法:

  • 直接寻址法
  • 数字分析法
  • 平方取中法
  • 折叠法
  • 随机数法
  • 除余数法

散列的性能跟key的计算方法有很大的关系。

练习

// 暂无

小结

  • 良好的散列表是均匀分布,糟糕的散列表是扎堆的,很多冲突。
  • 装填因子一旦大于0.7,就应该扩展位置总数