HashMap、HashSet等都是经典且经常使用的数据结构,各大高级程序设计语言中都会有直接调用哈希功能进行数据处理的标准类或者函数。那么当前的问题是,Hash中的Table为什么通常是质数?数组
首先咱们从哈希的优势出发:不管是HashSet仍是HashMap都能作到在O(1)的时间复杂度内查找、插入、删除数据。数据结构
如何作到在O(1)的时间复杂度内进行数据的查找、插入、删除操做,最简单的作法就是“用空间换时间”——建立一个超大的一维数组来存储每个key,基本需求解决,可是相应的,这种作法会带来一个问题,就是牺牲的空间太大,对这个问题的优化是将这个超大的一位数组转换为二维,这时就跟桶计数有些类似了,我能够预先设定有多少个桶等着存放数据,拿到想要存放的数据后对桶数取余、余数表明应该在第几个桶内存储,这样就定位出了当前数据在这个二维数组中的精确位置(须要访问两次内存),而为了数据的分散性,桶的数量通常取质数(这里抛砖引玉,对应的数学证实没有找到,静候大佬提供)。app
不定长拉链数组实现HashSet代码以下(除不定长实现外,还有一种定长拉链数组实现方法,详见 https://leetcode-cn.com/problems/design-hashset/solution/xiang-jie-hashset-de-she-ji-zai-shi-jian-4plc/):函数
1 class MyHashSet: 2 3 def __init__(self): 4 self.buckets = 1009 5 self.table = [[] for _ in range(self.buckets)] 6 7 def hash(self, key): 8 return key % self.buckets 9 10 def add(self, key): 11 hashkey = self.hash(key) 12 if key in self.table[hashkey]: 13 return 14 self.table[hashkey].append(key) 15 16 def remove(self, key): 17 hashkey = self.hash(key) 18 if key not in self.table[hashkey]: 19 return 20 self.table[hashkey].remove(key) 21 22 def contains(self, key): 23 hashkey = self.hash(key) 24 return key in self.table[hashkey] 25 26 ##做者:fuxuemingzhu 27 ##连接:https://leetcode-cn.com/problems/design-hashset/solution/xiang-jie-hashset-de-she-ji-zai-shi-jian-4plc/ 28 ##来源:力扣(LeetCode) 29 ##著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。