原创:Data Structure 学习笔记 之一 hash

原创:Data Structure 学习笔记 之一 hash

-------------------

hash是通过某种编码(hash函数或hashCode)将数据转化为其存储的地址的一种技术。

 

一般来说数据的编码范围太大,我们采用%等方法来压缩数据的编码到预期的范围。同时由于范围的缩小,不可避免的可能产生地址冲突。

 

通常有两种方法来处理这种冲突:开放地址法和链地址法。当发生冲突时,前者在数据表中继续寻找可用的地址;链地址法则是在数据表中的每一个地址中存储一个链表,冲突的数据依次填入链表。java中常用的HashMap使用的hash方式就是链地址法。

 

开放地址法在数据冲突时需要在数据表中寻找一个新的可用地址,有几个方式可以实现:线性探测、二次探测和再hash法。线性探测是在冲突的地址后依次的寻找可用地址。当数据的聚集度比较大的时候寻址的效率会严重下降。二次探测是使用自然数的平方做步长来探测新的地址,相比线性探测效率会更高一些。针对这两种方式都是使用确定的步长,再hash法使用一个新的hash函数对不同的数据生成不同的步长,从而避免数据的聚集。开放地址法对于各种操作的时间复杂度都是一致的,都需要同样的寻址过程。

 

链地址法值需要在hash对应的地址上将数据加入链表即可。链地址法对于聚集度大的数据的插入只需要0(1)的时间,这得益于链表。

 

 

对于聚集度大的数据,hash的查询操作(数据寻址)效率会严重下降。同时,填充度大时,操作的效率也会严重下降,这是因为可用的地址减少,地址冲突加剧。

你可能感兴趣的:(原创:Data Structure 学习笔记 之一 hash)