Java 中的索引映射(或允许负数的平凡哈希)2024年9月10日 | 阅读 9 分钟 索引映射,也称为简单哈希,是一种将数组元素映射到新数组索引的技术。这可用于有效地执行查找重复项或计算数组中元素出现次数等操作。索引映射的一种常见实现是使用一个数组,其中索引对应于原始数组的元素,而值表示每个元素的出现次数。这种方法效率很高,因为通过索引访问数组中的元素需要恒定的时间。 但是,当数组的元素可能为负数时,索引映射方法会变得更具挑战性。在这种情况下,我们需要确保负索引被映射到新数组中的正索引。一种实现此目的的方法是向索引添加一个固定的偏移值。例如,如果数组包含负值且最小值为 -10,我们可以将 10 加到每个索引上,以获得从 0 到 (max-min)+10 的有效索引范围。 处理简单哈希中的负值使用布尔数组在 Java 中处理索引映射或简单哈希中的负数时,我们可以使用偏移值将可能输入值的范围移至从零开始。这可以通过查找输入数组中的最小负值并将其绝对值添加到所有元素来实现。 例如,考虑输入数组 {-3, -1, 2, 5, -4}。此数组中的最小负值为 -4。将 -4 的绝对值(即 4)添加到数组中的所有元素会得到 {1, 3, 6, 9, 0}。我们现在可以创建一个大小为 10(数组中的最大值加 1)的索引映射数组,并使用此偏移值 4 将输入数组中的值映射到映射数组中的索引。 当访问映射数组中的元素时,我们可以简单地减去偏移值来检索原始值。例如,如果我们想检索索引 2 处的值(对应于原始值 2),我们将访问索引 6 处的映射数组(2 + 4),然后减去偏移值 4 以获得原始值 2。 总之,在 Java 中处理索引映射或简单哈希中的负数时,我们可以使用偏移值将可能输入值的范围移至从零开始,然后在从映射数组中检索原始值时减去此偏移值。 a) 初始化一个所有值都设置为零的哈希矩阵。 b) 遍历给定数组。
c) 搜索数组中的特定元素
d) 但是,如果 X 为负数
实施文件名: IndexMapping.java 输出 Present 解释 此 Java 程序实现了直接索引映射,允许负数。该程序初始化一个所有值都设置为 false 的哈希矩阵。然后,它遍历给定数组,检查每个元素是负数还是非负数。如果元素为非负数,则将矩阵中对应的哈希值设置为 true,位于 [ele][0]。但是,如果元素为负数,则取元素的绝对值,并将对应的哈希值设置为 true,位于 [ele][1]。为了搜索数组中的特定元素,程序会检查给定元素 X 是非负数还是负数。如果 X 为非负数,它会检查 [X][0] 处的值是否为 true。如果为 true,则表示该元素存在于数组中,否则不存在。同样,如果 X 为负数,它会取 X 的绝对值并检查 [X][1] 处的值是否为 true。 复杂度分析 将元素插入哈希矩阵的时间复杂度为 O(n),其中 n 是给定数组中的元素数量。在哈希矩阵中搜索元素的时间复杂度为 O(1),因为我们直接使用元素的索引来访问矩阵。因此,算法的总体插入时间复杂度为 O(n),搜索时间复杂度为 O(1)。 算法的空间复杂度为 O(MAX+1),即哈希矩阵的大小。但是,由于矩阵的大小固定为 1001,因此空间复杂度可以视为常数。 总之,算法的插入时间复杂度为 O(n),搜索时间复杂度为 O(1),空间复杂度为 O(1)。 使用取模运算符要实现 Java 中的简单哈希,可以使用内置的取模运算符 (%) 来计算给定键的哈希码。 文件名: TrivialHashing.java 输出 12 is not present in the hash table. 解释: 上面的 Java 程序实现了索引映射(或简单哈希)技术来在哈希表中插入和搜索元素。该程序将哈希表初始化为所有元素都设置为 -1,并使用一个哈希函数,该函数通过取元素与表大小的模来将元素映射到数组索引。为了处理负键,哈希函数使用额外的步骤,将取模运算的结果加上表大小,然后再次取模,以确保结果始终为非负数。insert() 函数通过查找空槽(使用线性探测)来在哈希表中插入元素,而 search() 函数通过探测直到找到元素或遇到空槽来在哈希表中搜索元素。main() 函数通过插入包含负键和正键的数组并搜索键 12 来测试程序。 复杂度分析 简单哈希算法的时间复杂度取决于键的分布和哈希表的大小。在最坏的情况下,当所有键都发生冲突时,插入和搜索操作的时间复杂度都将是 O(n),其中 n 是哈希表的大小。但是,如果键集分布良好,则这两个操作的预期时间复杂度将是 O(1),因为大多数冲突将通过线性探测来解决。就空间复杂度而言,哈希表需要 O(n) 的空间,其中 n 是表的大小。在此实现中,表大小固定为 20,这是一个相对较小的值,因此只要输入分布良好,该算法很可能会表现良好。 简单哈希的性能考量简单哈希是 Java 中一种简单高效的数据存储和检索方法,但我们还需要考虑一些性能因素。 一个主要的考虑因素是数组的大小。如果数组太大,将会有很多冲突,导致检索时间变慢。另一方面,如果数组太小,将会有很多浪费的空间,导致内存使用量增加。 另一个考虑因素是数据元素的分布。如果数据元素分布不均匀,将会有很多冲突,导致检索时间变慢。例如,如果我们想存储学生的成绩,而所有学生的学号都是 10 的倍数,那么将会有很多冲突,导致检索时间变慢。
下一主题Java 中二进制迷宫的最短路径 |
给我们一个整数计数,与一个由小写英文字母组成的字符串 'str' 相关联。此特定问题的目标是查找“相等计数子串”。当子串中的每个不同字母都出现恰好 count 次时,该子串称为...
阅读 6 分钟
Java 中有一个内置函数称为 DoubleAdder.intValue(),它遵循窄化原始转换,返回 sum() 的 int 值。该类对象的初始值为零。语法:public int intValue() 参数:此方法没有任何参数。返回...
阅读 3 分钟
给定一个字符串 inStr。我们的任务是查找并打印所有可以从字符串 inStr 生成的回文。请注意,字符串 inStr 的所有字符都必须用于生成回文。如果回文...
阅读9分钟
异常处理是编写健壮可靠的 Java 应用程序的关键方面。在复杂的系统中,错误可能发生在各个级别,了解异常的根本原因对于有效的调试和故障排除至关重要。Java 1.4 中引入的链式异常提供了强大的...
阅读 4 分钟
在 LTS 版本 11 之后的版本。JDK 12 是 6 个月发布周期的一部分。于 2019 年 3 月 19 日发布,它是一个非 LTS 版本,不提供长期支持。SE 平台的开源参考实现是...
5 分钟阅读
图中进行环检测是一个基本问题,在实际应用中被广泛使用,并且是许多领域(如网络设计、社交网络分析以及系统中的环查找)的重要工具。无向图中的环是指当可能...
7 分钟阅读
在 Java 中向数组添加元素 在 Java 中,数组是用于在连续内存位置中存储相同类型元素的基本数据结构。尽管数组一旦创建其大小就是固定的,但有不同的方法可以添加元素或创建具有...
5 分钟阅读
是 Java 中可用的按位运算符之一。XOR(又名异或)接受两个布尔操作数,如果它们不同则返回 true。XOR 运算符的最佳用例是当两个给定的布尔条件不能同时为真时....
5 分钟阅读
java 中的 repaint 方法在 java.applet.Applet 类中可用,它是一个 final 方法,每当我们想要调用 update 方法并调用 paint 方法时都会被调用;调用 refresh 方法会清除当前窗口,执行更新,然后...
阅读 3 分钟
继承的概念代表了 Java 中面向对象编程 (OOP) 的四大基本方面之一。子类可以通过继承机制继承其超类的所有字段和方法。该功能使开发人员能够重用代码块并创建可维护和可扩展的...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India