3

我有一个关于计算我们的哈希表负载的问题。所以哈希表中存在的对象数量。我知道当hashtable数组中有超过60%的对象时,效率就会降低。

我添加了我的“添加”方法,以便您可以看到我如何将对象添加到哈希表中。由于某种原因,Load 总是返回为 0。

class MyHashTable<T>{
private T[]values;
private int size;
//hash table size increases 10^n
public MyHashTable(){
    size = 0;
    values = (T[])(new Object[10]);
}
 public void add(T object){
    size = values.length;
    //checks if the # of stuff in the array is over 60%
    //expand if true
    if ((size+10)/size > 0.6){
        size*=2;
        T[]tmp = (T[]) (new Object[size]);
        for(int i=0; i<size/10; i++){
            if (values[i]!=null){
                add(values[i],tmp);
            }
        }
        values = tmp;
    }
    add(object, values);
}

public void add(T object, T[]values){   
    int location = Math.abs(object.hashCode())%values.length;
    while(values[location]!=null){
        location = (location+1)%values.length;
    }
    //System.out.println(object.hashCode());
    values[location] = object;
}
public int getLoad(){
    int load = 0;
    int location = 0;
    while(values[location]!=null){
        load+=1;
        location = (location+1)%values.length;
    }
    return load;
}
4

1 回答 1

0

我认为问题出在你的add(T object)方法上。您首先检查负载因子

 //checks if the # of stuff in the array is over 60%
 //expand if true
 if ((size+10)/size > 0.6){
 ....

这里有两个问题。

这可以评估的唯一方法false是当大小为负时。

假设size = 10 然后size +10 / size= 20/10=2

这可能不是这行代码的意图

另一个问题是这是一个整数除法,它将返回一个整数。在进行除法之前,您必须先转换sizetodouble或乘以才能获得 a回报。1.0double

于 2013-04-11T11:32:56.700 回答