1. 程式人生 > >哈希算法簡單回顧 + 設計RandomPool結構

哈希算法簡單回顧 + 設計RandomPool結構

比較 最大的 value one key 無限 self 存儲 重要

哈希回顧

比較重要的性質:

不可逆:當你知道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

哈希算法簡單回顧 + 設計RandomPool結構