关键字
- 散列函数
- 链表
- 数组
- 冲突
- 装填因子
数学公式
装填因子计算公式:
装填因子 = 散列表的元素数 / 位置的总数
比如:
// 一个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,就应该扩展位置总数