一、哈希表别称:关联数组、映射、特征表和字典
哈希表作为一种抽象数据类型,包括数据成员和增删改查操作、哈希、冲突及解决方案(open address)
在Python中是一种字典的存在,那么,可以作为Key的数据类型是int,float,str,object,不可以的数据类型是bool,list,tuple,dict,set
原因是:list,tuple,dict,set是mutable 可修改的,不可以作为key放在dict里
哈希函数把hash code(int float str转化为整数)/tabel.size=index
自定义的object可以把data member分别变成hashcode(即把int float str bool等值变成hashcode),在这种条件下增删改查的时间复杂度都是O(1)
一种存储及查找的方法,表示数值与数值存储位置的对应,不找值而是直接对应其地址
用空间换取时间
依据哈希函数求出关键字应该在的位置,再将数值放到应在的位置
冲突:不同的关键字经过哈希函数的计算映射到同一个哈希地址
解决冲突
哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集上,并以关键字在地址集中的象作为表中的存储位置,如此构造所得的查找表就是“哈希表”(散列表)
哈希函数一般为:除留余数法
Hash(key)=key mod p
二、处理冲突的方法:
开放定址法(open addressing):Liner probing,如何出现冲突,就线性的往下添加。缺点:最坏情况会变成O(n);会出现priming clustering.
开放定址的一种特殊情况:平方probing,避免出现primary交通堵塞,如果出现冲突,不会线性的往下排,而是用hashcode出来的Index进行平方操作,作为冲突后存放的地址,这样会出现secondery clustering,但出现的概率比较小。
链地址法(sperate chain):把冲突的元素用链表进行连接,缺点:会变成O(n)
在Python中采用open addressing,在JAVA中采用sperate chain
Rehash:在python中load factor是2/3,即如果在内存中存储的元素超过内存2/3,就会double存储空间,此时hashcode/table.size=index,由于table.size发生了变化,所以index也会变化
三、python中的hash
- dict和set均可用于hash 表
- collectors中其他的几个类型,见上条blog