zoukankan      html  css  js  c++  java
  • leetcode常规算法题复盘(科普短文篇)——为何哈希表的容量一般是质数

      HashMap、HashSet等都是经典且常用的数据结构,各大高级程序设计语言中都会有直接调用哈希功能进行数据处理的标准类或者函数。那么当前的问题是,Hash中的Table为何一般是质数?

      首先我们从哈希的优点出发:无论是HashSet还是HashMap都能做到在O(1)的时间复杂度内查找、插入、删除数据。

      如何做到在O(1)的时间复杂度内进行数据的查找、插入、删除操作,最简单的做法就是“用空间换时间”——创建一个超大的一维数组来存储每一个key,基本需求解决,但是相应的,这种做法会带来一个问题,就是牺牲的空间太大,对这个问题的优化是将这个超大的一位数组转换为二维,这时就跟桶计数有些相似了,我可以预先设定有多少个桶等着存放数据,拿到想要存放的数据后对桶数取余、余数代表应该在第几个桶内存储,这样就定位出了当前数据在这个二维数组中的精确位置(需要访问两次内存),而为了数据的分散性,桶的数量一般取质数(这里抛砖引玉,对应的数学证明没有找到,静候大佬提供)。

      不定长拉链数组实现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 ##著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

     

  • 相关阅读:
    PHP扫描图片转点阵 二维码转点阵
    PHP设计模式之观察者模式
    Vue router 使用 History 模式导致页面请求 404
    MySQL(Oracle)模糊查询 使用 instr () 替代 like 提升效率
    jmeter压测小白常见问题解决
    mac上批量启动appium,并把appium日志打印到指定文件夹
    批量启动appium-server+java
    启动appium常用参数解析
    TestNg执行时报org.testng.TestNGException: org.xml.sax.SAXParseException异常解决
    解决启动appium 提示端口被占用问题
  • 原文地址:https://www.cnblogs.com/monkiki/p/14535047.html
Copyright © 2011-2022 走看看