哈希算法简单回顾 + 设计RandomPool结构
哈希回顾
比较重要的性质:
不可逆:当你知道x的HASH值,无法求出x;
无冲突:当你知道x,无法求出一个y, 使x与y的HASH值相同
1 # 哈希特征: 2 # 1.输入无限 3 # 2.输出有穷 4 # 3.输入相同==>输出必相同 5 # 4.可能存在不同的输入结果输出一样 ==> 哈希碰撞 6 # 5.输入样本够大,在输出样本上几乎均匀分布 ==> 散列 7 # md 5 桶结构 hashcode模n ===> 在0--n-1上均匀分布 8 9 # 设计RandomPool结构 10 # 【题目】 设计一种结构,在该结构中有如下三个功能: 11 # insert(key):将某个key加入到该结构,做到不重复加入。 12 # delete(key):将原本在结构中的某个key移除。 13 # getRandom(): 等概率随机返回结构中的任何一个key。 14 # 【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1) 15 import random 16 17 18 class RandomPool: 19 def __init__(self): 20 self.dict1 = dict() # 字典1: key:存储key value:存储当前加入的顺序,第n个 21 self.dict2 = dict() # 字典2: key:存储count value:存储加入的key 22 self.size = 0 23 24 def insert(self, key): 25 if key not in self.dict1: 26 self.dict1[key] = self.size 27 self.dict2[self.size] = key 28 self.size += 1 29 30 def getRandom(self): 31 if self.size == 0: 32 return None 33 index = int(random.randrange(self.size)) 34 return self.dict2[index] 35 36 def delete(self, key): # 当删除指定key时,字典2中删除key对应的count后, 37 if key in self.dict1: # 把最大的count对应的value补到count上,方便getRandom()函数 38 delindex = self.dict1[key] 39 lastkey = self.dict2[self.size] 40 self.dict1.pop(key) 41 self.dict1[lastkey] = delindex 42 self.dict2[delindex] = lastkey 43 self.dict2.pop(self.size) 44 self.size -= 1
Talk is cheap, show my code to you.