我想实现一个HashMap数据结构,但我不太想知道如何处理底层数组结构。
如果我没记错的话,在HashMap中,每个键都经过哈希处理并转换为整数,该整数用于引用数组索引。由于直接引用,搜索时间为O(1)。
假设K是关键,V是值。我们可以创建一个大小为n的V型数组,它将驻留在hash(K)函数产生的索引中。但是,hash(K)不会产生连续的索引,并且Java的数组不是稀疏的,要解决此问题,我们可以创建一个非常大的数组来容纳元素,但效率不高,它将容纳很多NULL元素
一种解决方案是按连续顺序存储元素,要查找元素,我们必须搜索整个数组并检查元素的键,但这将是线性时间。我想实现直接访问。
谢谢。
答案 0 :(得分:1)
从Wikipedia article on hash tables借用,您可以通过使用像数组大小这样的哈希值对底层存储使用较小的数组,如下所示:
hash = hashfunc(key)
index = hash % array_size
这是一个很好的解决方案,因为您可以使基础数组保持相对密集,而不必修改哈希函数,也不会影响时间复杂度。
答案 1 :(得分:0)
您可以查看所有问题的源代码。
为了不执行大量代码。您问题的解决方案是使用模。您可以选择n = 64,然后将h(x)mod 64 = 2的元素x存储在数组的第二个位置,...
如果两个元素具有相同的哈希模n,则将它们彼此相邻存储(通常在树图中完成)。另一个解决方案是增加n。