首先,这是一个家庭作业问题。没有找到完整的答案,只是一些帮助。
数据结构&我现在采用的算法类是很多笔和纸理解算法如何工作,但实际编码很少。我是一个编程菜鸟,所以这对你们中的一些人来说可能是一个愚蠢的问题。
从概念上讲,我理解散列和不同方法的原因,但我对如何编码这个分配感到迷茫。
基本上我们可以使用我们想要的任何源代码。本书中的代码为http://users.cis.fiu.edu/~weiss/dsaajava3/code/SeparateChainingHashTable.java和http://users.cis.fiu.edu/~weiss/dsaajava3/code/QuadraticProbingHashTable.java
使用这些代码中的任何一个时,我似乎无法将密钥插入表中。我正在使用此块来插入:
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(99999);
for (int i = 0; i < 100; i++) {
H.insert(""+randomInt);
}
这似乎并没有在表格中插入任何内容,但是,尽管插入量很大,但大小仍保持不变。 另外,我不知道如何确定需要多少探针。
我是否完全错了?我觉得我很......
答案 0 :(得分:1)
Random randomGenerator = new Random();
for (int i = 0; i < 100; i++) {
int randomInt = randomGenerator.nextInt(99999);
H.insert(""+randomInt);
}
试试这个,你在一个不好的地方有一条线。
我的探测案例:
/**
* Method that performs quadratic probing resolution.
* @param x the item to search for.
* @return the position where the search terminates.
*/
private int findPos( AnyType x )
{
int offset = 1;
int currentPos = myhash( x );
while( array[ currentPos ] != null &&
!array[ currentPos ].element.equals( x ) )
{
currentPos += offset; // Compute ith probe
offset += 2;
if( currentPos >= array.length )
currentPos -= array.length;
}
return currentPos;
}
如果我正确理解:
这种方法正在进行探测,是吗?因此,您必须计算在两个选项中调用此方法的次数:重复,而不是重复。如果添加了当前元素并且两个整数,则使用一些标志。在此方法中,添加if
以检查标志并增加一个计数器。您将拥有多个探测器。
编辑:
[LIN-np]:使用非素数表大小1000 [LIN-p]进行线性探测: 使用素数表大小1019进行线性探测。注意1019是 minPrime(1000),即大于1000的最小素数。 [QDR-p]:使用素数表大小1019 [DBL-p]进行二次探测: 具有主表大小1019和冲突分辨率的双重散列 在素数97上散列。
您必须使用HashTable,它使用探测并测试探测量(平均值)。您在public class QuadraticProbingHashTable<AnyType>
中有二次探测算法。并且您必须将哈希表长度设置为1019.在第一个练习中,您必须使用线性探测。因此,当您开始添加元素时,基本上您必须使用具有指定前提条件的HashTable。
您必须在哈希表中实现此功能并检查它的使用次数。我认为它会以某种方式显示它产生的碰撞次数。快乐的编码。完成二次算法,只需要设置前置条件)(硬编码起始值为1019)。