使用 hashCode 获取数组 java 元素的索引
Get index of element of an array java with hashCode
我有一个包含很多单词的字符串数组。我希望获得数组中包含的单词的索引(如果不包含则为-1)。
我首先做了一个循环来搜索数组中的所有元素,同时递增一个变量,当我找到它时,我 return 变量的值。
然而,数组可能非常非常大,因此搜索所有元素非常慢。我决定在我的字符串数组中添加一个新单词之前,我将使用 hashCode() % arrayLength
来获取我应该放置它的位置的索引。然后,为了取回索引,我只需重用 hashCode() % arrayLength
即可立即知道它在哪个索引处。
问题是有时会有"clashes",两个元素在数组中可以有相同的索引。
有人知道如何处理吗?或者任何其他替代方法来更快地获取元素的索引?
您正在尝试使用数组实现 Open Addressing。除非这是一个作业练习,否则 Java 标准库已经有 类 来解决搜索和碰撞问题。
您可能想使用 HashSet
来检查 String
是否存在。在幕后,它使用 HashMap
实现 Separate Chaining 来解决冲突。
String[] words = { "a" };
Set<String> set = new HashSet<>(Arrays.asList(words));
return set.contains("My Word") ? 1 : -1;
您所指的技术是哈希表的一般实现之一。它被称为线性探测,它是一种称为开放寻址的通用技术。如果你根据hashCode() % array.length
计算了这个词的索引,发现有冲突(非空元素或者不是你要找的元素);那么您可以通过三种方式来执行冲突解决:
线性搜索
这是通过递增位置并检查它是否为空或是否有您要查找的元素来完成的。也就是说,您的第二个位置将是 (hashCode(input) + 2) % array.length
,然后是 (hashCode(input) + 3) % array.length
,依此类推。这种方法的问题是,如果数组接近完全填充,您的插入或查找性能将降低到线性 O(n)。
二次搜索
这只是对上述技术的优化,如果您发现冲突,则通过二次跳转。因此,您的第二个索引将是 (hashCode(input) + 2*2) % array.length
,然后是 (hashCode(input) + 3*3) % array.length
等等,这有助于更快地到达正确的位置。
双重哈希
通过引入 另一个 散列函数 hashCode2()
,这是一种更有效的解决方法,您可以将其与第一个散列函数结合使用。在这种情况下,您的下一个搜索索引将是 (hashCode(input) + 2*hashCode2(input)) % array.length
,然后是 (hashCode(input) + 3*hashCode2(input)) % array.length
,依此类推。
跳转的随机分布越多,它在大型哈希表上的性能就越好
希望这对您有所帮助。
我有一个包含很多单词的字符串数组。我希望获得数组中包含的单词的索引(如果不包含则为-1)。
我首先做了一个循环来搜索数组中的所有元素,同时递增一个变量,当我找到它时,我 return 变量的值。
然而,数组可能非常非常大,因此搜索所有元素非常慢。我决定在我的字符串数组中添加一个新单词之前,我将使用 hashCode() % arrayLength
来获取我应该放置它的位置的索引。然后,为了取回索引,我只需重用 hashCode() % arrayLength
即可立即知道它在哪个索引处。
问题是有时会有"clashes",两个元素在数组中可以有相同的索引。
有人知道如何处理吗?或者任何其他替代方法来更快地获取元素的索引?
您正在尝试使用数组实现 Open Addressing。除非这是一个作业练习,否则 Java 标准库已经有 类 来解决搜索和碰撞问题。
您可能想使用 HashSet
来检查 String
是否存在。在幕后,它使用 HashMap
实现 Separate Chaining 来解决冲突。
String[] words = { "a" };
Set<String> set = new HashSet<>(Arrays.asList(words));
return set.contains("My Word") ? 1 : -1;
您所指的技术是哈希表的一般实现之一。它被称为线性探测,它是一种称为开放寻址的通用技术。如果你根据hashCode() % array.length
计算了这个词的索引,发现有冲突(非空元素或者不是你要找的元素);那么您可以通过三种方式来执行冲突解决:
线性搜索
这是通过递增位置并检查它是否为空或是否有您要查找的元素来完成的。也就是说,您的第二个位置将是 (hashCode(input) + 2) % array.length
,然后是 (hashCode(input) + 3) % array.length
,依此类推。这种方法的问题是,如果数组接近完全填充,您的插入或查找性能将降低到线性 O(n)。
二次搜索
这只是对上述技术的优化,如果您发现冲突,则通过二次跳转。因此,您的第二个索引将是 (hashCode(input) + 2*2) % array.length
,然后是 (hashCode(input) + 3*3) % array.length
等等,这有助于更快地到达正确的位置。
双重哈希
通过引入 另一个 散列函数 hashCode2()
,这是一种更有效的解决方法,您可以将其与第一个散列函数结合使用。在这种情况下,您的下一个搜索索引将是 (hashCode(input) + 2*hashCode2(input)) % array.length
,然后是 (hashCode(input) + 3*hashCode2(input)) % array.length
,依此类推。
跳转的随机分布越多,它在大型哈希表上的性能就越好
希望这对您有所帮助。