[英]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 Size
为10
。
然而; 一旦增加大小, 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.