Hash散列 开放定址法与链地址法

1 篇文章 0 订阅

假设一个数组中表示位置key={0,1,2,3,4,5,6,...},对应存储的哈希函数为hash(key)==H,key的个数为m

开放定址法:(H+di)%m

1,线性探测再散列:(H+i) % m;i=0,1,2,...,m-1,即di为1,2,3,4,5,6,......

2,平方探测再散列:(H+pow(-1,r)*(i-r)/2)%m,r=i%2;即key,key+1*1,key-1*1,key+2*2,key-2*2,...直到结果对应的数组有空间.di为1,-1,4,-4,9,-9,16,-16...      --------之所以用平方,是为了避免键值对的聚集成群。通俗的说就是产生冲突的键值对在表的一团成群出现。 使用二次探查法可以有效减少冲突出现的次数。

3,伪随机探测再散列:di为伪随机数

链地址法:将所有哈希地址相同的记录都链接在同一链表里.

每个存储哈希值的空间,实际上存储了一个链表的节点,有hash相同的值存入时,就将这个新值作为一个节点写在链表中.


链地址法的性能:

由于哈希表高效的特性,查找或者插入的情况在大多数情况下可以达到O(1),时间主要花在计算hash上,当然也有最坏的情况就是hash值全都映射到同一个地址上,这样哈希表就会退化成链表,查找的时间复杂度变成O(n),但是这种情况比较少,只要不要把hash计算的公式外漏出去并且有人故意攻击(用兴趣的人可以搜一下基于哈希冲突的拒绝服务攻击),一般也不会出现这种情况


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值