哈希表

一、哈希表别称:关联数组、映射、特征表和字典

哈希表作为一种抽象数据类型,包括数据成员和增删改查操作、哈希、冲突及解决方案(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

  1. dict和set均可用于hash 表
  2. collectors中其他的几个类型,见上条blog

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值