哈希表扩容

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

哈希表扩容的思想

  • 为什么需要扩容?
    • 目前, 我们是将所有的数据项放在长度为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步中的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开放地址法是一种解决哈冲突的方法,它通过在哈中寻找下一个可用的位置来存储冲突的元素。当哈的装载因子达到一定阈值时,需要进行扩容来保持哈的性能。下面是开放地址法的哈扩容的步骤: 1. 创建一个新的更大的哈,通常是原哈大小的两倍。 2. 将原哈中的所有元素重新哈到新的哈中。 3. 将新的哈替换为原哈。 在重新哈的过程中,需要使用新的哈函数来计算元素在新哈中的位置。常见的重新哈方法有线性探测、二次探测和双重哈等。 下面是一个示例代码,演示了开放地址法的哈扩容过程: ```python class HashTable: def __init__(self, size): self.size = size self.keys = [None] * size self.values = [None] * size def hash_function(self, key): return key % self.size def rehash(self, key): return (key + 1) % self.size def put(self, key, value): index = self.hash_function(key) while self.keys[index] is not None: if self.keys[index] == key: self.values[index] = value return index = self.rehash(index) self.keys[index] = key self.values[index] = value def resize(self): new_size = self.size * 2 new_keys = [None] * new_size new_values = [None] * new_size for i in range(self.size): if self.keys[i] is not None: index = self.hash_function(self.keys[i]) while new_keys[index] is not None: index = self.rehash(index) new_keys[index] = self.keys[i] new_values[index] = self.values[i] self.size = new_size self.keys = new_keys self.values = new_values # 创建一个哈 hash_table = HashTable(5) # 添加元素 hash_table.put(1, 'A') hash_table.put(2, 'B') hash_table.put(3, 'C') hash_table.put(4, 'D') hash_table.put(5, 'E') # 扩容 hash_table.resize() # 输出扩容后的哈 print(hash_table.keys) print(hash_table.values) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值