海量数据处理技术(1): 散列技术

海量数据处理技术(1): 散列技术

Hash,音译“哈希”,也称为散列表。它是将任意的输入通过映射函数映射到一个指定的输出空间。该映射函数函数称为hash函数,指定的输出空间称为hash表。通常是将一个大的数据集映射到一个小的数据集上。hash技术常用于字典或数据库等key-value系统中,将Key通过hash函数映射到hash表中,然后在该映射位置存储value的值(或者存储指向value的指针),这样在查找时,便只需对key进行hash一次便得到了它对应的value存储的位置。hash的一般映射关系如下,并维基百科上借用张图来说明下:

h:keyT{0,1,2...,m1}

这里写图片描述

查找复杂度

  • 在一些合理的假设下,在散列表中查找一个元素的的期望时间为 O(1)
  • 最坏的情况下,查找一个元素的时间为 O(n) ,在所有的key都映射到一个地址上面了,此时hash表的性能和链表一样。

它有如下的特点:

  1. 对于不同关键字可能得到相同的散列地址,即 key1key2 存在 h(key1)=h(key2) ,这 种情况叫做冲突Collision。每一个hash函数都可能出现这种情况,所以在设计时必须考虑如何解决冲突处理。
  2. 同一hash函数,对于不同的散列地址其关键字一定不同。

(1) hash函数的构造

好的hash函数一般有如下的特点:

  • 一个好的hash函数应(近似地)满足简单一致散列的假设,即每个关键字都等可能地散列到m个槽位的任何一个中去,并与其他的关键字已被散列到哪个个槽为无关。
  • 一个好的hash函数应能最小化将这些相近的符号散列到同一个槽中的可能性,比如pt和pts的散列值要经可能的不一致,而不要相同。

(1.1) 直接寻址法

(1.2) 除法散列法

(1.3) 乘法散列法

(1.4) 全域散列法

(2) hash函数冲突处理

(2.1) 开放寻址法

  • 线性探查
  • 二次探查
  • 双重散列

(2.2) 链表法

(2.3) 再hash法

(2.4) 建立一个公共的溢出区

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值