Java 哈希表自身实现中的负载因子

Java 哈希表自身实现中的负载因子,java,Java,作为datastructure and algorithm实验问题的一部分,我尝试创建Customhashtable,将CustomLinkedList[]作为底层数据结构,以避免共谋(分离链接)。但是当负载因子超过0.75时,我一直在研究如何将以前的内容映射到大小增加的新数组,以便返回的索引与新大小相同,代码用于哈希,大小为100 public int arrayIndex(String key) { int index = key.charAt(0); for(int j =

作为datastructure and algorithm实验问题的一部分,我尝试创建Customhashtable,将CustomLinkedList[]作为底层数据结构,以避免共谋(分离链接)。但是当负载因子超过0.75时,我一直在研究如何将以前的内容映射到大小增加的新数组,以便返回的索引与新大小相同,代码用于哈希,大小为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;
     }
}
public int-arrayIndex(字符串键)
{
int index=key.charAt(0);

对于(int j=1;j基本上,您构建一个新的哈希表,并将所有数据从旧的哈希表迁移到新的哈希表。加载因子是一个触发器,用于告诉您何时构建新的(更大的)表,这意味着新的哈希表将具有更大的起始数组

您还可以(为了好玩)添加一个“最小加载因子”设置,这将构造一个较小的哈希表。使用具有最小和最大加载因子的解决方案,初始备份数组(这是哈希选择表单的唯一部分)将根据存储项的数量对其大小进行概念上的调整。由于大小与性能相关,这可以使哈希表始终保持可接受的性能范围(通过增加和缩小其内存占用)

至于荷载系数的计算

  (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(...);
  }
(在存储例程中)
if(数组[索引]==null){
loadCount++;
}
如果(加载计数/阵列大小>最大加载){
调整大小(…);
}
(在删除例程中)
如果(数组[索引]被清除为空){
装载计数--;
}
if(负载计数/阵列大小<最小负载){
调整大小(…);
}

基本上,您可以构造一个新的哈希表,并将所有数据从旧的哈希表迁移到新的哈希表。加载因子是一个触发器,用于告诉您何时构造较新(较大)的哈希表,这意味着新的哈希表将有一个较大的起始数组

您还可以(为了好玩)添加一个“最小加载因子”设置,这将构造一个较小的哈希表。使用具有最小和最大加载因子的解决方案,初始备份数组(这是哈希选择表单的唯一部分)将根据存储项的数量对其大小进行概念上的调整。由于大小与性能相关,这可以使哈希表始终保持可接受的性能范围(通过增加和缩小其内存占用)

至于荷载系数的计算

  (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(...);
  }
(在存储例程中)
if(数组[索引]==null){
loadCount++;
}
如果(加载计数/阵列大小>最大加载){
调整大小(…);
}
(在删除例程中)
如果(数组[索引]被清除为空){
装载计数--;
}
if(负载计数/阵列大小<最小负载){
调整大小(…);
}

在一个简单的实现中,当您在哈希表中增加备份数组的大小时,所有存储元素的索引都将更改,并且您需要从链接列表中删除元素,因为元素不太可能在新映射中继续共享同一个存储桶

例如,最初我们的支持阵列为:

0: [ A ]
1: [ ]
2: [ B, C ]
3: [ D ]
然后我们增加备份阵列,最终可能会得到:

0: [ ]
1: [ ]
2: [ C ]
3: [ ]
4: [ D ]
5: [ A ]
6: [ ]
7: [ B ]

备份数组中的每个项都需要重新计算其哈希和模,因为它现在属于一个新的存储桶。如果您使用特定的备份数组大小,则可能有一种更优化的方法来执行此重新计算或映射,您可以查看现有的哈希表实现以了解它们的作用(即java.util.HashMap的源代码随时可用),但通常您需要将所有元素移动到其正确的存储桶。

在直接实现中,当您增加哈希表中备份数组的大小时,所有存储元素的索引都将更改,并且您需要从链接列表中删除元素,因为元素不太可能继续共享sam在新地图上画一个水桶

例如,最初我们的支持阵列为:

0: [ A ]
1: [ ]
2: [ B, C ]
3: [ D ]
然后我们增加备份阵列,最终可能会得到:

0: [ ]
1: [ ]
2: [ C ]
3: [ ]
4: [ D ]
5: [ A ]
6: [ ]
7: [ B ]

备份数组中的每个项都需要重新计算其哈希和模,因为它现在属于一个新的存储桶。如果您使用特定的备份数组大小,则可能有一种更优化的方法来执行此重新计算或映射,您可以查看现有的哈希表实现以了解它们的作用(即java.util.HashMap的源代码随时可用),但通常需要将所有元素移动到正确的存储桶。

不要使用索引,使用计数器来保存填充的条目数。1)帮自己一个忙,找到一个更健壮的哈希算法。只有在计算完完整的哈希值后,才应该“mod”它取决于数组大小。2)在某些情况下,溢出方案是在保留现有元素的同时放大表,然后“记住”以前大小的历史记录和“mod”在搜索时按每个先前大小依次调整哈希值,直到找到匹配项为止。以较慢的搜索速度为代价,可以减少放大的开销。不要使用索引,使用计数器来保存填充的条目数。1)帮自己一个忙,找到一个更健壮的哈希算法。只有在计算完完整的哈希值后,才应该“mod”它取决于数组大小。2)在某些情况下,溢出方案是在保留现有元素的同时放大表,然后“记住”以前大小的历史记录和“mod”在搜索时按每个先前的大小依次调整哈希值,直到找到匹配项。以降低搜索速度为代价,可以减少放大的开销。不,您必须创建新数组,然后使用常规哈希例程将所有项添加到该数组中,因为哈希的模数在数组之间可能不相同。通常来说,如果(x mod y==5)那么你就不能(除非在一些非常特殊的情况下)知道(x mod z==5)。不,你必须创建新的数组,然后使用普通的散列例程将所有项添加到其中,因为散列的模可能不会被识别