leetcode常規算法題覆盤(科普短文篇)——爲什麼哈希表的容量通常是質數

  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 ##著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索