散列表(HASH)

来源:互联网 发布:可以刷ubuntu的手机 编辑:程序博客网 时间:2024/05/17 00:52


散列表是数组结构的推广,数组是在整数索引的基础上进行直接寻址操作,O(1)的时间复杂度带来高效的访问


直接寻址HASH表

关键字的范围比较小,集合中的冲突基本为0的情况下,使用HASH,达到O(1)查找,插入,删除


缺点:

关键字范围大时不适用,

范围大(但适用)然而集合数目小,数据填充率低,空间浪费严重;


带函数HASH表

为了解决空间浪费问题,使关键字集合范围集中

散列函数:一种好的方法导出的散列值,在某种程度上应独立于数据可能存在的任何模式,形式相近的关键字应具有截然不同的散列值

除法取余:一个不太接近2的幂的素数,通常是比较合理的选择

乘法:h(k)=m(kA mod 1)

全域散列:随机选择hash函数,使其独立于关键字的特性

// by zjerry 算法导论中设计了一个,需要利用到数论中的知识,暂时先放放


缺点:

引入了冲突问题


避免冲突:尽量随机化

解决冲突:只能尽可能解决

1.链地址法:将散列函数值相同的元素放入到链表中

2.开放寻址法:

利用 探查序列,将HASH表全部利用完,节省了指针链表的空间,缺点是删除问题不好解决

探查序列分类:

线性探查:简易但容易造成聚集

二次探查:容易造成二次聚集(轻度聚集)

双重散列:两个不同函数对关键字求值,相加之和,获得随机性的HASH值


完全散列

可以用两级HASH函数或两级HASH方式来设计完全散列


0 0
原创粉丝点击