我们在来将讲一个哈希表的概念: 哈希表扩容.
哈希表扩容的思想
- 为什么需要扩容?
- 目前, 我们是将所有的数据项放在长度为8的数组中的.
- 因为我们使用的是链地址法, loadFactor可以大于1, 所以这个哈希表可以无限制的插入新数据.
- 但是, 随着数据量的增多, 每一个index对应的bucket会越来越长, 也就造成效率的降低.
- 所以, 在合适的情况对数组进行扩容. 比如扩容两倍.
- 如何进行扩容?
- 扩容可以简单的将容量增加大两倍(不是质数吗? 质数的问题后面再讨论)
- 但是这种情况下, 所有的数据项一定要同时进行修改(重新哈希化, 来获取到不同的位置)
- 比如hashCode=12的数据项, 在length=8的时候, index=4. 在长度为16的时候呢? index=12.
- 这是一个耗时的过程, 但是如果数组需要扩容, 那么这个过程是必要的.
- 什么情况下扩容呢?
- 比较常见的情况是loadFactor>0.75的时候进行扩容.
- 比如Java的哈希表就是在装填因子大于0.75的时候, 对哈希表进行扩容.
哈希表扩容的实现
-
我们来实现扩容函数
-
代码解析:
- 步骤1: 先将之前数组保存起来, 因为我们待会儿会将storeage = []
- 步骤2: 之前的属性值需要重置.
- 步骤3: 遍历所有的数据项, 重新插入到哈希表中.
-
在什么时候调用扩容方法呢?
- 在每次添加完新的数据时, 都进行判断. (也就是put方法中)
-
修改put方法
- 代码第5步中的内容
-
如果我们不断的删除数据呢?
- 如果不断的删除数据, 当loadFactor < 0.25的时候, 最好将数量限制在一半.
-
修改remove方法
- 代码第4步中的内容