在自己实现的HashTable中加载因子

时间:2013-07-11 17:55:39

标签: java

作为数据结构和算法中的一个实验问题的一部分,我尝试创建我的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;
     }
}

2 个答案:

答案 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的源代码随时可用),但一般来说,您需要将所有元素移动到正确的存储桶中。