HASH方法课下补分博客

课堂要求:利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75)关键字集合:85,75,57,60,65,(你的8位学号相加值),98,74,89,12,5,46,97,13,69,52,92。完成计算并提交计算过程。

实践要点:通过课上对hash方法以及散列函数的学习,了解散列冲突的机制,并学习解决散列冲突的方法。主要学习和实践的方法是开放地址法和拉链法,首先需要理解这两种方法的实现过程,然后运用到实际的题目中去解决问题。

散列函数的构造:

散列函数的选择有两条标准:简单和均匀简单指散列函数的计算简单快速;

均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集k随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。

实验过程:首先是开放地址法

1.基本思想:在散列表中形成一个探查序列,沿此序列逐单元进行查找,直到找到一个空的单元时将新结点放入。当发生地址冲突后,求解下一个地址用:ND =( D+di)%m i=1,2,…,k(k<= m-1);关于开放地址法的key值问题:H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1)) ,其中: H ( key ) 为关键字 key 的直接哈希地址, m 为哈希表的长度, di 为每次再探测时的地址增量。

采用这种方法时,首先计算出元素的直接哈希地址 H ( key ) ,如果该存储单元已被其他元素占用,则继续查看地址为 H ( key ) + d 2 的存储单元,如此重复直至找到某个存储单元为空时,将关键字为 key 的数据元素存放到该单元。

对应到题目中的内容:首先是关键字集合,85,75,57,60,65,(你的8位学号相加值),98,74,89,12,5,46,97,13,69,52,92,学号为20162309,则累加学号为23,则关键字集合为85,75,57,60,65,23,98,74,89,12,5,46,97,13,69,52,92。因为长度为17,散列因子为0.75,则计算出的n值为23(实际为22.667),距离其最近的且不大于23的最小质数为19,本题也可以用key值除以23.

则可以得到散列函数为: H(key)=key%23

结合散列地址的计算方法,相同余数后进一位法则,得到散列表的储存空间状态。在散列地址的求解中,共有四个关键字余数为0,则按照从大到小的顺序依次占据了散列地址的前四个位置。

由此可以列出散列图:

相关开发地址法的信息补充:

开放地址法的双散列法,是另一种开放地址的取值方法,首先使用第一个散列函数H1(key)及逆行那个散列,一旦发生冲突,则使用第二个函数H2(key)计算改项到达下一个存储地址的增量,其取值p和key有关,范围在1和m之间,并且与m互质的正整数。

双散列的取值自然需要两个key值,可取D = H1(key);p = H2(key);则ND = (D+p)%m。

哈希方法下的元素删除问题:删除的数据所在位置需做标记,对利用开放地址法查了冲突所产生的哈希表中删除一个元素,不能简单地直接删除,因为这样将截断其它具有相同哈希地址的元素的查找地址,所以应设定一个特殊的标志以表明该元素已被删除。

第二个方法是拉链法:

1.基本思想:拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。

如果拉链法没有出现堆积,则可以直接删除。

具体到题目上,因为已经得到了散列地址和储存空间,则拉链法的图就比较容易得到了。

则:

拉链法需要列出重复的量,且要按进入的顺序列出。

时间: 2024-10-28 14:18:07

HASH方法课下补分博客的相关文章

第十二章课下测试补交博客

第十二章课下测试补交博客

hash课堂测试补分博客

题目要求: 解题过程: 散列法: 散列表相关概念: 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).建立了关键字与存储位置的映射关系,公式如下: 存储位置 = f(关键字) 这里把这种对应关系f称为散列函数,又称为哈希(Hash)函数.详情见:Java中hashCode的作用. 采用散列技术将记录存在在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表.那么,关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方

解决同伴收获&amp;解决同伴问题补分博客

解决同伴问题 要求: 查看同组同学的课堂笔记,尝试解决同伴的问题,格式如下: 我的同组同学是XXXX学号XXXX同学 同组同学的问题是XXXX 我理解他的意思是XXXX 他的问题我有一个小建议是XXXXX 其他(可选) 解答: 我的同组同学是20162324学号春旺同学 同组同学的问题是 :回溯法与分支限界法的区别 我理解他的意思是:寻找这两个方法的不同 他的问题我有一个小建议是: 1.在一般情况下,分支限界法与回溯法的求解目标不同. 回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法

Dijkstra算法课后补分博客

题目名称:Dijkstra算法 题目要求:课上给出相关附图,求解附图顶点A的单源最短路径. 附图: 做题过程 1.了解Dijkstra算法的相关知识,包括定义以及使用方法. 定义:Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式.注意该算法要求图中不存在负权边.具体的定义如下:Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的

20162312图的深度优先遍历补分博客

要求: 写出附从每个顶点出发的一次深度优先搜索遍历序列. 在纸上画出遍历过程和序列,提交截图,注意写上学号和姓名. 过程: 从图中某个顶点发A 出发,访问此顶点,然后依次从A 的未被访问的邻接点出发,直至图中所有和A 有路径相通的顶点都被访问到: 若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止.

20162312图的广度优先遍历补分博客

要求: 写出附图从每个顶点出发的一次广度优先搜索遍历序列. 在纸上画出遍历过程和序列,提交截图,注意写上学号和姓名. 过程: 1.先访问完当前顶点的所有邻接点. 2.先访问顶点的邻接点先于后访问顶点的邻接点被访问.

20165322 第十周课下补做

第十周课下补做 课程知识点总结 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: Comparable:"可比较的",(欲参与比较的对象对应的元素类需实现Comparable接口) 使用这种策略来比较时,两个对象(这里两个对象是指一个类的两个不同实例)本身必须是"可比较的",比较的标准由对象所在的类来定义,这种可比较的能力是对象本身固有的,因此不需要第三方参与就可以完成比较.要使得两个对象本身是可比较的,那么对象所在的类必须实现Compa

20165235 第十周课下补做

20165235 祁瑛 第十周课下补做 相关知识点的总结 LinkedList<String> mylist=new LinkedList<String>()来创建一个链表. mylist.add();来添加结点. get(int index)来获取链表中第index个位置的结点的对象. public static sort(List<E>)将链表中的元素升序排列 public static binarySearch(List<T>,T key,Compar

20165308 2017-2018-2 第十周课下补做

20165308 2017-2018-2 第十周课下补做 一.教材十五章代码分析 代码分析有的是以注释的形式写出,对整个代码的理解是写在前面的 1.p442-443 Example15_1.java Cone.java 此类不关心怎么样计算面积,计算面积由后面的类完成,只需调用即可,只关心计算体积. public class Cone<E> { double height; E bottom; //用泛型类E声明对象bottom public Cone(E b) { //参数b是泛型类型 bo