算法笔记:哈希表、映射和集合

hash函数是根据关键字key计算出应该存储地址的位置 , 哈希函数把key转成哈希值来定位数据存储的位置 , 是基于哈希函数建立的一种查找表 , Python 中的字典就是用哈希表来实现的 。本文主要介绍哈希表、映射和集合这三种数据结构以及他们在python中的用法 。
哈希表-Hash table哈希表哈希表(Hash table) , 也叫散列表 , 根据键(Key)访问在内存储存位置的数据 , 通过把键值映射到表中一个位置来访问记录 , 映射函数称为散列函数或者哈希函数 , 根据哈希函数建立的记录数据的表称为哈希表(散列表) 。
比如键值为k , 对应的值放在 f(k) 的存储位置上 , 这个对应关系 f 称为散列函数 , 通过它来建立的表称为散列表 。
哈希碰撞两个不同的key值得到相同的哈希值的情况称为哈希碰撞(Hash Collisions) , 也就是 f(k1) = f(k2) 。哈希碰撞的解决方案有:开放寻址(Open Addressing)法、链地址法(Chaining)、再哈希法(Rehash)和建立一个公共溢出区 。

  • 开放寻址法:产生冲突后继续寻找下一个空闲的空间(没有被占用的存储地址) , Python使用的就是这种方法 。
  • 链地址法:散列到同一位置的元素 , 不继续往下寻找 , 而是将所有关键字为同义词的记录存储在同一线性链表中 , HashMap就采用了链地址法 。
  • 再散列函数法:产生冲突后 , 就再来一次哈希计算 , 直到没有冲突 。
  • 建立一个公共溢出区:也就是建两个表 , 一个作为基本表 , 另一个是存储和基本表发生冲突元素的溢出表 。
哈希冲突的发生 , 往往会降低字典和集合操作的速度 。因此 , 为了保证其高效性 , 字典和集合内的哈希表 , 通常会保证其至少留有 1/3 的剩余空间 。随着元素的不停插入 , 当剩余空间小于 1/3 时 , Python 会重新获取更大的内存空间 , 扩充哈希表 。
python 字典Python 中的字典就是典型的哈希表 , 是一系列由键(key)和值(value)配对组成的元素的集合 , 其中value可以是任何数据类型 , 且可以重复 。Key不能重复并且必须是不可变(immutable)的 。
在 Python3.7+版本中 , 字典是有序的 ,  3.6 之前是无序的 。
创建字典# 创建空字典>>> mydict={}>>> type(mydict)<class 'dict'>>>> mydict{}>>> mydict = {1:"Apple",2:"banana"}# dict()方法创建字典>>> mydict = dict({1:"apple",2:"banana"})>>> mydict = dict([(1, 'apple'), (2, 'banana')])>>> mydict{1: 'apple', 2: 'banana'}# fromkeys()方法>>> seq=(1,2,3)>>> mydict = dict.fromkeys(seq)>>> mydict{1: None, 2: None, 3: None}>>> mydict = dict.fromkeys(seq,'apple')>>> mydict{1: 'apple', 2: 'apple', 3: 'apple'}理论上来说 , 直接使用{}创建字典比dict()方法效率更高 ,  {} 会直接调用底层C代码 。
直接使用Dict[Key] = ‘Value’的形式新增元素 , 可以增加任何数据类型 , 比如可以嵌套字典 , 列表等 。如果key已经存在 , 则进行更新 。
>>> mydict={}>>> mydict[2] = 'banana'>>> mydict{2: 'banana'}访问元素直接使用key访问元素值 , 也可以使用 get(key) 方法获取 , 如果键不存在 , 调用 get() 函数可以返回一个默认值
>>> mydict = {1:"apple",2:"banana"}>>> mydict[2]'banana'>>> mydict.get(2)'banana'>>> mydict.get(3,'null')'null'setdefault()方法也可以用来获取元素值 , 和get()方法不同的是 , 如果查找的key不存在 , 它会设置一个默认值(default=None):
>>> mydict.setdefault(2)'banana'>>> mydict.setdefault(3)>>> mydict{1: 'apple', 2: 'banana', 3: None}>>> mydict.setdefault(4,'orange')'orange'>>> mydict{1: 'apple', 2: 'banana', 3: None, 4: 'orange'}删除元素del删除元素
>>> mydict = {1:"apple",2:"banana"}>>> del mydict[2]>>> mydict{1: 'apple'}


推荐阅读