哈希表扩容

我们在来将讲一个哈希表的概念: 哈希表扩容.

哈希表扩容的思想

  • 为什么需要扩容?
    • 目前, 我们是将所有的数据项放在长度为8的数组中的.
    • 因为我们使用的是链地址法, loadFactor可以大于1, 所以这个哈希表可以无限制的插入新数据.
    • 但是, 随着数据量的增多, 每一个index对应的bucket会越来越长, 也就造成效率的降低.
    • 所以, 在合适的情况对数组进行扩容. 比如扩容两倍.
  • 如何进行扩容?
    • 扩容可以简单的将容量增加大两倍(不是质数吗? 质数的问题后面再讨论)
    • 但是这种情况下, 所有的数据项一定要同时进行修改(重新哈希化, 来获取到不同的位置)
    • 比如hashCode=12的数据项, 在length=8的时候, index=4. 在长度为16的时候呢? index=12.
    • 这是一个耗时的过程, 但是如果数组需要扩容, 那么这个过程是必要的.
  • 什么情况下扩容呢?
    • 比较常见的情况是loadFactor>0.75的时候进行扩容.
    • 比如Java的哈希表就是在装填因子大于0.75的时候, 对哈希表进行扩容.

哈希表扩容的实现

  • 我们来实现扩容函数

哈希表扩容_第1张图片

 

  • 代码解析:

    • 步骤1: 先将之前数组保存起来, 因为我们待会儿会将storeage = []
    • 步骤2: 之前的属性值需要重置.
    • 步骤3: 遍历所有的数据项, 重新插入到哈希表中.
  • 在什么时候调用扩容方法呢?

    • 在每次添加完新的数据时, 都进行判断. (也就是put方法中)
  • 修改put方法

    • 代码第5步中的内容

哈希表扩容_第2张图片

  • 如果我们不断的删除数据呢?

    • 如果不断的删除数据, 当loadFactor < 0.25的时候, 最好将数量限制在一半.
  • 修改remove方法

    • 代码第4步中的内容

哈希表扩容_第3张图片

你可能感兴趣的:(散列表,java,哈希算法)