我的作业处理散列并使用Horner的多项式来创建散列函数。我必须使用(1 + 1 /(1-L)** 2)/ 2(Usuccessful)或(1 + 1 /(1-L))/ 2(成功)计算理论探针长度进行线性探测,然后对于与二次探测相对应的正确方程式也是如此。然后我必须将理论值与负载系数0.1到0.9的实验值进行比较。我正在使用find方法并搜索100个随机整数来获取实验数据。我遇到的问题是,一旦查找成功或失败,我没有获得正确的probeLength值。
我创建10000个随机整数来填充,然后我将搜索100个随机整数。
for(i = 0; i<10000; i++)
{
int x = (int)(java.lang.Math.random() * size);
randomints.add(x);
}
//Make arraylist of 10000 random ints to fill
for(p = 0; p<100; p++)
{
int x = (int)(java.lang.Math.random() * size);
randomintsfind.add(x);
}
稍后我有一个循环来完成查找并跟踪查找成功或失败的次数。那部分是有效的。它还应该跟踪每个查找的probeLength,然后将它们全部加在一起,这样它可以分别除以成功或失败次数,以找出平均值。这就是我遇到问题的地方。 probeLength没有被正确检索,我不知道为什么。
这是调用find方法并跟踪这些变量以及创建和填充的代码部分。
HashTableLinear theHashTable = new HashTableLinear(primesize);
for(int j=0; j<randomintscopy.length; j++) // insert data
{
//aKey = (int)(java.lang.Math.random() * size);
aDataItem = new DataItem(randomintscopy[j]);
theHashTable.insert(aDataItem);
}
for(int f = 0; f < randomintsfindcopy.length;f++)
{
aDataItem = theHashTable.find(randomintsfindcopy[f]);
if(aDataItem != null)
{
linearsuccess += 1;
experimentallinearsuccess += theHashTable.probeLength;
theHashTable.probeLength = 0;
}
else
{
linearfailure += 1;
experimentallinearfailure += theHashTable.probeLength;
theHashTable.probeLength = 0;
}
}
然后是HashTableLinear类中的find方法
public DataItem find(int key) // find item with key
{
int hashVal = hashFunc(key); // hash the key
probeLength = 1;
while(hashArray[hashVal] != null) // until empty cell,
{ // found the key?
if(hashArray[hashVal].getKey() == key)
return hashArray[hashVal]; // yes, return item
++hashVal; // go to next cell
++probeLength;
//System.out.println("Find Test: " + probeLength);
hashVal %= arraySize; // wraparound if necessary
}
return null; // can't find item
}
当我在find方法中测试打印probeLength值时,调用find的循环中获取的值彼此不同。
答案 0 :(得分:0)
我意识到我对此非常认真。它通过制作一个getter和一个setter来解决它,然后在找到或找不到该项后设置该值,然后使用getter检索该值。