您的位置:首页 > 其它

哈希表的知识点介绍

2016-07-08 09:29 405 查看
散列表(HASH TABLE)也叫哈希表,是基于快速存取的角度设计的,也是一种典型的“以空间换时间”的做法。是根据关键码值而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫散列函数,存放记录的数组叫散列表。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。
  而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。
然而如果不需要有序遍历数据,井且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。
Hash 表是使用 O(1) 时间进行数据的插入删除和查找,但是 hash 表不保证表中数据的有序性,这样在 hash 表中查找最大数据或者最小数据的时间是
O(N) 。

常见哈希冲突解决方法:1.开放地址法;2.线性探测法;3.链地址法(拉链法);4.二次探测法;5.伪随机探测法;6.再散列(双重散列,多重散列);7.建立一个公共溢出区

拉链法:这个方法就是使用链表处理冲突,只要有冲突就增加一个链表结点。
双哈希法:就是这个hash函数有冲突,就换一个hash函数试试。
建立公共溢出区:就是将哈希表分为基本表和溢出表,凡是有冲突的就直接放到溢出区。

常见的散列函数有:直接定址法,数字分析法,平法取中法,去余法,折叠法,随机法

单旋转法是一种hash函数的构造方法,不是解决冲突的方法。

开放定址法:一旦发生冲突,就去寻找下一个空的散列地址,只要散列地址够大,空的地址总会找到;链地址发:一旦发生冲突,在当前位置给单链表增加结点就行。开放地址法处理冲突需要探测,而拉链法处理冲突直接在当前位置增加结点就行。

装填因子增大,意味着哈希表的空间利用率在增大。
开哈希和闭哈希主要区别在于:随着哈希表的密集度提高,使用闭哈希时,不仅会与相同哈希值的元素发生冲突,还容易与不同哈希值的元素发生冲突;而开哈希则不受哈希表疏密与否的影响,始终只会与相同哈希值的元素冲突而已。所以在密度变大的哈希表中查找时,显然开哈希的平均搜索长度不会增长。开哈希表——链式地址法,闭哈希表——开放地址法;

拉链法的优点
与开放定址法相比,拉链法有如下几个优点:
(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
(4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地 将被删结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条 件。 因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

拉链法的缺点

 拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  哈希表