gpt4 book ai didi

java - 调整哈希表大小

转载 作者:行者123 更新时间:2023-12-02 06:27:32 24 4
gpt4 key购买 nike

但是,我正在尝试调整我的哈希表的大小;我不断收到 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;
}

示例。 大小 = 3。最大大小 = 5
如果我们采用最大尺寸并乘以0.75,我们会得到3.75
这个因素表明,如果我们传递它,Max Size 必须double
因此,如果我们在table中添加一个额外的元素,则大小为4,并且为> 3.75,因此新的最大大小10
然而;一旦我们增加大小,hashcode将会随着新元素的添加而改变,所以我们调用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 方法没有检索元素

最佳答案

如果这就是您的 resize() 代码,那么您无法将 newTable 分配给类属性,即您的旧表。现在,您用数据填充它,然后不对它执行任何操作,因为它是在 resize 内部定义的,因此在其外部不可用。

所以你最终认为你现在有了一张更大的 table ,但事实上你仍在使用旧的 table ;-)

关于java - 调整哈希表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com