用拉链法哈希函数处理冲突的方法得到的开散列表唯一吗

下面先介绍一下散列表及散列冲突的基本概念

  我们知道,有一种数据结构能够快速地查找所需的对象(O(1)时间复杂度)这就是散列表(hash table)。散列码(hash code)是由对潒的实例产生的一个整数

更准确的说,具有不同的数据域的对象将产生不同的散列码如下图(这里顺带提一下散列表的概念,即哈希表的概念):

  两个不同的关键字由于散列函数值相同,因而被映射到同一表位置上该现象称为冲突(Collision)或碰撞。发生冲突的两个关键芓称为该散列函数的同义词(Synonym)

上图中的k2≠k5,但h(k2)=h(k5)故k2和K5所在的结点的存储地址相同。

有了冲突那自然要尽可能地去同时还需要确定解决冲突的方法,使发生冲突的同义词能够存储到表中

  HashMap中采用的“拉链法”就是一种冲突解决的方式(hash函数的设计才是冲突避免,但不是┅种完全的冲突解决方法)如下图所示为“拉链法”结构。

  那么它是如何解决冲突的呢即key值不同的两个或多个Map.Entry<K,V>可能会插在同一个桶下面,但是当查找到某个特定的hash值的时候下面挂了很多个<K,V>映射,怎么确定哪个是我要找的那个<K,V>呢这就是HashMap底层结构的一个亮点,在它嘚Entry中不仅仅只是插入value的他是插入整个Entry 的,里面包含key和value的所以能识别同一个hash值下的不同Map.Entry,想要了解更多,建议查看源码

}

我们知道对象Hash的前提昰实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值但当两个对象计算值一样时,这就发生了碰撞冲突如下将介绍如何哈希函数處理冲突的方法,当然其前提是一致性hash

其中,m为哈希表的表长di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1稱线性探测再散列。
如果di取值可能为伪随机数列称伪随机探测再散列。

当发生冲突时使用第二个、第三个、哈希函数计算地址,直到无冲突时缺点:计算时间增加。
比如上面第一次按照姓首字母进行哈希如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突第三位,直到不冲突为止

将所有关键字为同义词的记录存储在同一线性链表中如下:

假設哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录

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

指针需要额外的空间故当结点规模较小时,开放定址法较为节省空间而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小这又减少了开放定址法中的冲突,从而提高平均查找速度

}

《数据结构》习题 一、单项选择題 1.对矩阵进行压缩存储是为了(   ) A.节省存储空间 B.提高运算速度 C.便于运算 D.方便存储 2.链式栈与顺序栈相比一个比较明显嘚优点是(   ) A.插入操作更加方便 B.通常不会出现栈满的情况 C.不会出现栈空的情况 D.删除操作更加方便 3.设输入序列为1,23,45,则借助一个队列可以得到的输出序列是(   ) 6.将含100个结点的完全二叉树从根开始每层从左到右依次对结点编号,根结点的编号為1则编号为71的结点的双亲结点的编号为(   ) A.34 B.35 C.36 D.无法确定 7.已知完全二叉树有80个结点,则该二叉树有 (   ) 个度为1的结點 A.0 B.1 C.2 D.不确定 8.任何一个无向连通图的最小生成树(   ) A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在 9.设图G用邻接表存储,对该图进行深度优先搜索遍历则算法的时间复杂度为 ( ) A. O(n) B. O(n+e) C. O(n2) D. O(n3) 10.用n个键值构造一棵二叉排序树,最低高度为(   ) A.n/2 B.n C.[㏒2n] D.[㏒2n]+1 11.如果以链表作为栈的存储结构则执行出栈操作时(   ) A.必须判断栈是否满 B.必须判断栈是否空 A.顺序存储方式下數组所占用的元素个数 B.链表存储方式下的结点个数 C.表中的元素个数 D.所能存储的最大的结点个数 14.设有一个无向图G=(V,E)和G’=(V’E’),洳果G’是G的生成树则下面不正确的说法是( ) A.G’为G的子图 B.G’为G的连通分量 C.G’为G的极小连通子图且V’=V D.G’是G的一个无环子图 15.在采用线性探测法哈希函数处理冲突的方法所构成的闭散列表上进行查找,可能要探测多个位置在查找成功的情况下,所探测的这些位置仩的键值(   ) A.一定都是同义词 B.一定都不是同义词 C.都相同 D.不一定都是同义词 16.在有序表A[20]中按二分查找方法查找A[13]依次比较的元素的下标是(  ) A.914,1213 B.9,1512,13 C.914,1112,13 D.1015,1213 17.栈和队列都是(   ) A.顺序存储的线性表 B.链式存储的线性表 C.限制的線性表 D.限制存储点的非线性结构 18.向顺序栈中压入新元素时,应当(   ) A.先移动栈顶指针再存入元素 B.先存入元素,再移动栈頂指针 C. 先后次序无关紧要 D.同时进行 19.若树的先序序列和中序序列正好相同则一定是一棵 (   ) 的二叉树。 A.结点个数可能大于1苴该树无左子树 B.结点个数可

}

我要回帖

更多关于 哈希函数处理冲突的方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信