作为数据结构和算法中的一个实验问题的一部分,我尝试创建我的Customhashtable,其中CustomLinkedList []作为基础数据结构,以避免串通(单独链接)。但是当负载系数超过0.75时,我是坚持如何将以前的内容映射到增加大小的新数组,以便返回的索引与新大小相同,散列代码为size = 100
public int arrayIndex(String key)
{
int index = key.charAt(0);
for(int j = 1;j<key.length;j++)
{
int temp = key.charAt(j);
index = ((index*27)+temp)%100;
}
}
答案 0 :(得分:1)
基本上,您构造一个新的哈希表,并将所有数据从旧的哈希表迁移到新的哈希表。加载因子是一个触发器,告诉您何时构造更新(更大)的表,这意味着新的哈希表将具有更大的起始数组。
你可以(为了好玩)还添加一个&#34; min加载因子&#34;设置,它将构造一个较小的哈希表。对于具有最小和最大负载因子的解决方案,初始后备阵列(其是散列选择形式的唯一部分)将在概念上基于存储的项目的数量来调整其大小。由于大小与性能有关,因此可以允许散列表始终保持可接受的性能范围(通过增加和缩小它的内存占用量)。
就负载系数的计算而言
(in the store routines)
if (array[index] == null) {
loadCount++;
}
if (loadCount / arraySize > maxLoad) {
resizeUp(...);
}
(in the remove routines)
if (array[index] is cleared to null) {
loadCount--;
}
if (loadCount / arraySize < minLoad) {
resizeDown(...);
}
答案 1 :(得分:0)
在直接实现中,当您在哈希表中增加后备数组的大小时,所有存储元素的索引都将更改,并且您需要从链接列表中删除元素,因为元素不太可能继续在新地图中分享同一个桶。
E.g。最初我们有支持数组:
0: [ A ]
1: [ ]
2: [ B, C ]
3: [ D ]
然后我们增加了支持数组,我们可能最终得到:
0: [ ]
1: [ ]
2: [ C ]
3: [ ]
4: [ D ]
5: [ A ]
6: [ ]
7: [ B ]
支持数组中的每个项目都需要重新计算其哈希值和模数,因为它现在属于新存储桶。如果使用特定的支持数组大小,可能有一种更优化的方法来执行此重新计算或映射,您可以查看现有的哈希表实现以查看它们的作用(即java.util.HashMap的源代码随时可用),但一般来说,您需要将所有元素移动到正确的存储桶中。