检索线性/二次散列的探针长度

时间:2014-04-01 19:46:56

标签: java hash

我的作业处理散列并使用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的循环中获取的值彼此不同。

1 个答案:

答案 0 :(得分:0)

我意识到我对此非常认真。它通过制作一个getter和一个setter来解决它,然后在找到或找不到该项后设置该值,然后使用getter检索该值。