我有一个关于确定哈希表的负载的问题。所以哈希表中存在的对象数量。我知道当散列表数组中有超过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;
}
答案 0 :(得分: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
这可能不是这行代码的意图
另一个问题是这是一个整数除法,它将返回一个整数。在进行除法之前,您必须将size
转换为double
或乘以1.0
以获得double
作为回报。