繁体   English   中英

调整哈希表的大小

[英]Re-Sizing Hash Table

但是,我正在尝试调整hash table大小; 我一直在获取NullPointerException 我知道如果大小大于0.75则表大小必须加倍;如果小于0.50则表大小将减半。 到目前为止,我有这个。

public boolean add(Object x)
{
  int h = x.hashCode();
  if (h < 0) { h = -h; }
  h = h % buckets.length;

  Node current = buckets[h];
  while (current != null)
  {
     if (current.data.equals(x)) { return false; }
        // Already in the set
     current = current.next;
  }
  Node newNode = new Node();
  newNode.data = x;
  newNode.next = buckets[h];
  buckets[h] = newNode;
  currentSize++;
  double factor1 = currentSize * load1; //load1 = 0.75
  double factor2 = currentSize * load2; //load2 = 0.50
  if (currentSize > factor1) { resize(buckets.length*2); }
  if (currentSize < factor2) { resize(buckets.length/2); }

  return true;
}

例。 Size = 3. Max Size = 5
如果我们将“ Max Size乘以0.75则得出3.75
这就是说如果我们通过它, Max Size必须double
因此,如果我们在table添加一个额外的element ,则大小为4> 3.75因此新的Max Size10
然而; 一旦增加大小, hashcode将随着添加新element ,因此我们调用resize(int newSize)

private void resize(int newLength)
{
  //   
   HashSet newTable = new HashSet(newLength);

   for (int i = 0; i < buckets.length; i++) {
       newTable.add(buckets[i]);
   }
}

如果buckets[i]混淆了任何人,这是我的构造函数。

public HashSet(int bucketsLength)
{
  buckets = new Node[bucketsLength];
  currentSize = 0;
}

我认为逻辑是正确的,除非我的resize方法未检索elements

如果这是resize()全部代码,则您无法将newTable分配给类属性,即旧表。 现在,您要用数据填充数据,然后不对其进行任何处理,因为它是在resize内部定义的,因此无法在外部使用。

因此,您最终认为自己现在有一张更大的桌子,但实际上您仍在使用旧的桌子;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM