*散列表(哈希表)

散列表(哈希表)

  • 散度表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数存放记录的数组叫做散列表

    给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

class HashMap(object):
 2     def __init__(self):
 3         # 初始化总表为,容量为2的表格(含两个子表)
 4         self.maps = BetterMap(2)
 5         self.num = 0        # 表中数据个数
 6     
 7     def get(self,k):        
 8         return self.maps.get(k)
 9     
10     def add(self, k, v):
11         # 若当前元素数量达到临界值(子表总数)时,进行重排操作
12         # 对总表进行扩张,增加子表的个数为当前元素个数的两倍!
13         if self.num == len(self.maps.maps): 
14             self.resize()
15         
16         # 往重排过后的 self.map 添加新的元素
17         self.maps.add(k, v)
18         self.num += 1
19         
20     def resize(self):
21         """ 重排操作,添加新表, 注意重排需要线性的时间 """
22         # 先建立一个新的表,子表数 = 2 * 元素个数
23         new_maps = BetterMap(self.num * 2)
24         
25         for m in self.maps.maps:  # 检索每个旧的子表
26             for k,v in m.items:   # 将子表的元素复制到新子表
27                 new_maps.add(k, v)
28         
29         self.maps = new_maps      # 令当前的表为新表
class BetterMap(object):
 2     """ 利用LinearMap对象作为子表,建立更快的查询表 """
 3     def __init__(self,n=100):
 4         self.maps = []          # 总表格
 5         for i in range(n):      # 根据n的大小建立n个空的子表
 6             self.maps.append(LinearMap())
 7     
 8     def find_map(self,k):       # 通过hash函数计算索引值
 9         index = hash(k) % len(self.maps)
10         return self.maps[index] # 返回索引子表的引用     
11 
12     # 寻找合适的子表(linearMap对象),进行添加和查找
13     def add(self, k, v):
14         m = self.find_map(k)        
15         m.add(k,v)
16     
17     def get(self, k):
18         m = self.find_map(k)
19         return m.get(k)

  1. 实现一个基于链表法解决冲突问题的散列表
  2. 实现一个 LRU 缓存淘汰算法

作业:哈希表

  • 并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)

参考

  1. 哈希表学习笔记
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值