散列表(哈希表)
-
散度表(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)
- 实现一个基于链表法解决冲突问题的散列表
- 实现一个 LRU 缓存淘汰算法
作业:哈希表
- 并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)