Java 中的开散法和闭散法2024 年 9 月 10 日 | 阅读 14 分钟 在本文中,我们将学习 Java 编程语言中的开放寻址哈希和封闭寻址哈希。阅读完本文,我们将涵盖该主题的不同部分,例如这些技术在 Java 编程语言中的用途,使用这些技术的优缺点以及开放寻址哈希和封闭寻址哈希之间的区别。 冲突处理技术如果两个数据在哈希表中具有相同的值,则称为哈希中的冲突。由于哈希函数的键对于整数或字符串是较小的数字,因此两个键很可能产生相同的值。因此,冲突也称为新插入的键映射到哈希表中已占用位置的情况。这些冲突使用称为冲突处理技术的不同技术进行处理。这些技术也称为冲突解决技术。 用于处理或解决冲突的技术主要分为两类。它们是
开放寻址哈希第一种冲突解决或处理技术“开放寻址哈希”俗称拉链法。这是一种用于将数组实现为链表的技术,称为链。它是程序员处理冲突最常用的技术之一。基本上,链表数据结构用于实现拉链法。当许多元素被散列到单个槽的索引时,它们会被插入到单链表中。这个单链表就是我们在开放寻址哈希技术中提到的链。 我们可以使用键“K”通过线性遍历来搜索链。如果键 K 和单链表中任何条目的内部键相等,则表示我们找到了条目。但是,如果我们遍历单链表并在不找到条目的情况下到达末尾,则表示我们要查找的条目不存在。 因此,当有两个键争夺同一个键位置时,这两个键或记录将被分配到同一个键位置。在用链表放置一个键后,键位置会进一步扩展。最后,哈希表将包含发生冲突的链。这就是称此技术为“链式技术”的主要原因。 开放寻址哈希的优点
开放寻址哈希的缺点
开放寻址哈希中使用的数据结构
实现开放寻址哈希的程序输出 3 4 null 2 false 开放寻址哈希中嵌入了不同的函数,用于在上述程序中实现拉链法。让我们看看这些函数是什么以及它们如何用于开放寻址哈希过程。 开放寻址哈希中使用的函数
现在,我们将看到这些函数的详细实现,以便更好地理解和描绘程序。 函数实现
注意:如果“n”是我们最初打算填充的链中单元格的总数,例如 10,并且其中 7 个单元格现在已填满,则负载因子为 7/10,即 0.7。因此,这就是用于在哈希表中解决冲突的开放寻址哈希技术。现在,让我们看看并理解封闭寻址哈希技术。 封闭寻址哈希第二种冲突解决技术,封闭寻址哈希,是一种处理冲突的方式,类似于拉链法。在开放寻址中,哈希表本身存储所有元素。表的大小始终应大于或等于键的总数(我们也可以在需要时通过复制已存在的旧数据来增加表的大小)。此机制称为封闭寻址哈希。整个过程的形成和考虑是探测。 封闭寻址哈希中使用的函数
执行封闭寻址哈希的几种技术1. 线性探测:在线性探测中,哈希表从哈希的初始或起始点开始进行清晰整洁的检查。如果计算后得到的槽已被占用,则我们应寻找不同的槽。负责执行重新哈希的函数是“key = rehash(n+1)%table-size”。两个探测或位置之间的空间通常为 1。 让我们来看一下线性探测,对于槽索引“hash(a)”,它使用哈希函数进行计算。它是具有最佳缓存性能的最佳技术之一。 线性探测遇到的困难
2. 二次探测:在二次探测中,与线性探测相比,当哈希函数不同时,键位置之间的间隔会增加。通过使用二次探测技术可以轻松解决上述技术中由聚集引起的问题。此技术也称为中平方方法。当当前运行的迭代为“i”时,则 i^2 的位置被视为该键的键位置。只有当我们尝试的键位置已被占用时,才会检查其他位置的槽。这是具有封闭特性的哈希表最有效和最高效的方法。它具有平均缓存性能,但存在轻微的聚集问题。 二次探测遇到的困难 它处理次聚集,有时两个键具有相同的探测序列,只要它们具有相同的键位置。 3. 双重散列 在此解决技术中,使用另一个哈希函数,该函数是专门为双重散列机制创建的。在此技术中,有效地处理并进一步减少了键之间形成的聚集。键位置的增量由将在此机制中使用的函数确定。使用该函数,根据其键计算键位置,并相应地放置它们。然后将函数与变量“i”相乘,然后执行模运算。 双重散列中的困难 与其他技术相比,双重散列的缓存性能较差,但没有聚集问题。由于需要执行两个哈希函数,因此完成整个过程所需的时间更长。因此,这会导致缓存性能不佳。除此之外,双重散列没有问题。 实现封闭寻址哈希的程序输出 The key 246 is not found in the hash table. It has done 20 step sizes. The key 246 is not removed as the element does not exist in a hash table. 开放寻址哈希和封闭寻址哈希概述开放寻址哈希主要用于避免实现中的复杂性并以简单的方式完成工作,而封闭寻址哈希则涉及更多的复杂性和计算。开放寻址哈希对可以插入的元素、键或记录没有大纲或边界。当使用开放寻址哈希时,可以无限制地输入记录。封闭寻址哈希受到一些有限记录的约束,其中一些记录可能没有足够的键位置供其输入。在开放寻址哈希中,会创建额外的存储空间,而不管表的大小如何。这种存储用于发生冲突的情况。封闭寻址哈希中不执行此类型的机制,因为整个表是记录放置的唯一来源,并且不添加外部存储。 下一个主题Java 中的 DAO 类 |
在本节中,我们将讨论如何在 Java 中打印元音字符串的反序。元音是字母“a”、“e”、“i”、“o”和“u”,元音字符串是仅包含元音的字符串。我们将首先定义问题陈述...
阅读 4 分钟
数据类型定义了存储在变量中的数据类型。类型指定了数据的种类(不同的大小和值)。Java 编程语言有两种数据类型:原始数据类型(预定义数据类型)和非原始数据类型。在本节中,我们将理解非原始数据类型...
5 分钟阅读
人们通常将按值传递和按引用传递这两个术语一起使用。这真的很令人困惑,而且在面试中经常听到这样的问题:Java 是按值传递还是按引用传递,还是两者都是?所以这个问题的答案是 Java 严格来说是按值传递...
阅读 3 分钟
在本节中,我们将学习什么是 Adam 数,并创建 Java 程序来检查给定的数是否为 Adam 数。Adam 数程序经常在 Java 编码测试和学术界中被问到。Adam 数:如果一个数满足...,则称该数为 Adam 数。
阅读 3 分钟
| Java ArrayList 大小 ArrayList 是 java.util 包的一部分,用于存储对象的动态列表。当添加或删除元素时,ArrayList 的大小可以动态地增加或减少。在 Java 中,要获取长度(元素数量)...
阅读 4 分钟
在 Java 中,当字符前面有一个反斜杠(\)时,它被称为 Java 转义序列或转义字符。请记住,转义序列必须用双引号("")括起来。它们用于表示难以或不可能直接表示的字符...
阅读 4 分钟
在本节中,我们将讨论什么是梅森数,并创建 Java 程序来检查给定数字是否是梅森数。梅森数程序经常出现在 Java 编码面试和学术界。梅森数 在数学中,梅森数是...
阅读 3 分钟
在 Java 中,处理日期和时间并非难事,因为 Java 提供了日期和时间 API,使开发人员的任务更加轻松。在本节中,我们将讨论如何从当前日期和任何特定日期减去天数。使用 Java...
阅读 3 分钟
给定两个坐标点 (x1, y1) 和 (x2, y2),确定直线的中间点。中点公式由以下公式确定的点 M 是两个点 (x1, y2) 和 (x2, y2) 的中点:M = ( (x1+x2)/2,...
阅读 2 分钟
在 Java 中,变量是保存值的容器。变量名表示内存位置的名称。每个变量包含三个元素:数据类型、变量名和值。变量可能具有作用域(私有、受保护),但这取决于需求。数据类型:它定义...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India